附加到上线的匹配(Append to the previous line for a match)

2019-07-30 13:07发布

我可以使用sedawk如果找到匹配追加到前行?

我有一个有格式的文件:

          INT32
          FSHL (const TP  Buffer)
             {
          INT32
          FSHL_lm (const TP  Buffer) 
          { WORD32 ugo = 0; ...

我所试图做的是扫描独立的开括号{并将其追加到以前的非空行.The比赛不应该由在同一行的任何附加的开括号出现。

预期的输出:

           INT32
          FSHL (const TP  Buffer){
          INT32
          FSHL_lm (const TP  Buffer) 
          { WORD32 ugo = 0; ...

感谢您的答复。

Answer 1:

这可能会为你工作(GNU SED):

sed '$!N;s/\n\s*{\s*$/{/;P;D' file

说明:

  • $!N除非最后一行追加下一行到模式空间。
  • s/\n\s*{\s*$/{/更换换行,随后没有或之后没有或任何的空白量的字符串的末尾的白色空间后跟一个大括号的任何量,由一个大括号。
  • P打印高达和包括第一个换行符。
  • D高达删除和包括第一个换行符(如果是的话不开始新的循环)。


Answer 2:

使用的方法之一perl 。 我读啜食模式下的所有文件,并使用正则表达式搜索线只用花括号并删除其前导空格。

perl -ne '
    do {
        local $/ = undef;
        $data = <>;
    };
    $data =~ s/\n^\s*(\{\s*)$/\1/mg;
    print $data
' infile

假设infile有问题的内容,输出将是:

FSHL (const TP  Buffer){
INT32
FSHL_lm (const TP  Buffer)
{ WORD32 ugo = 0; ...


Answer 3:

使用一种方法awk

awk '!(NF == 1 && $1 == "{") { if (line) print line; line = $0; next; } { sub(/^[ \t]+/, "", $0); line = line $0; } END { print line }' file.txt

还是爆发了多条线路:

!(NF == 1 && $1 == "{") { 
    if (line) print line
    line = $0
    next
}

{
    sub(/^[ \t]+/, "", $0)
    line = line $0
}

END {
    print line
}

结果:

INT32
          FSHL (const TP  Buffer){
          INT32
          FSHL_lm (const TP  Buffer) 
          { WORD32 ugo = 0; ...

HTH



Answer 4:

[希亚姆@本地〜] $ perl的-lne的/ ^ / \ N /如果$> 1 && / ^ \ d + /。 printf的 “%S”,$ _” appendDateText.txt

那可行

I / P:

2016年6月12日20:30测试测试测试

测试一下

2019年12月6日下午8点三十ABB abcbcb abcbc

2016年6月11日20:30测试测试

i123312331233123312331233123312331233123312331233Test

2016年6月12日20:30 ABC

O / P:

2016年6月12日20:30测试测试TestTestTest

2019年12月6日下午8点三十ABB abcbcb abcbc

2016年6月11日20时三十分测试## testi123312331233123312331233123312331233123312331233Test



文章来源: Append to the previous line for a match
标签: bash shell sed awk