sed/awk 使以小写字母开头的行合并到上一行

sed/awk 使以小写字母开头的行合并到上一行

这是我所拥有的


A
样本
文本

如何

我需要的输出是:

这是一个示例文本
怎么做 ?

此外,我怎样才能实现同样的目标:


A
样本
文本
如何

如何将以非大写字符开头的行附加到前一行?

答案1

sed -r ':a;N;$!ba;s/\n([^A-Z])/ \1/g'

:a创建标签b

N将所有行合并搜索,而不是逐行搜索

$!如果不是最后一行,b则分支(转到)标签a(跳过最后一行,因为最后一行有一个换行符)

s代换

\n\([^A-Z]\)匹配换行符,后跟任何非大写字母。()将任何非大写字母组合在一起。

/ \1/'用空格替换我们的匹配项,后跟第 1 组

g将保持缓冲区的内容复制到模式空间

信用属于这里这里这里

答案2

考虑到有些句子可能也包含大写单词,也许这可能是您正在寻找的解决方案:

sed -n '
1h
1!H
$ {
        g
        s/\n\n/<br>/g
        p
}
' | \
sed -n '
1h
1!H
$ {
        g
        s/\n/ /g
        p
}
' | \
sed -e 's/<br>/\n/g'

答案3

bash 内置命令是最快的方法 :-)

declare -a A
mapfile -t A <inputFile
for line in "${A[@]}"
do
  if [ -n "${line}" ]
  then
     if [ "${line}" = "${line^}" ]
     then
         echo -en "\n${line} "
     else
         echo -n "${line} "
     fi      
 else 
    echo "" # newline, because input line was empty
  fi
done   

答案4

对于第一个样本:

awk '{$1=$1}1' RS= file

第二个样本:

awk '/^[[:upper:]]/{print x}1' file | awk '{$1=$1}1' RS=

相关内容