附加到上一行以进行匹配

时间:2012-07-23 09:30:51

标签: bash shell sed awk

如果找到匹配项,我可以使用sedawk附加到上一行吗?

我有一个格式为

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

我要做的是扫描独立的开括号{并将其附加到前一个非空白行。对于由同一行中的任何内容追加的开括号,不应该匹配。

预期产出:

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

感谢您的回复。

4 个答案:

答案 0 :(得分:6)

这可能适合你(GNU sed):

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

说明:

  • $!N除非最后一行将下一行附加到模式空间。
  • s/\n\s*{\s*$/{/替换一个换行符,后面跟着没有或没有任何数量的空格,后跟一个开口的花括号,后面跟着没有或任何数量的空格到字符串的末尾,用一个开口的花括号。
  • P打印并包含第一个换行符。
  • D删除并包含第一个换行符(如果是这样,请不要开始新的循环)。

答案 1 :(得分:2)

使用perl的一种方法。我以slurp模式读取所有文件并使用正则表达式搜索只有大括号的行并删除其前导空格。

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; ...

答案 2 :(得分:2)

使用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

答案 3 :(得分:0)

[shyam @ localhost~] $ perl -lne&#39; s / ^ / \ n / if $。&gt; 1&amp;&amp; / ^ \ d + /; printf&#34;%s&#34;,$ _&#39; appendDateText.txt

将起作用

I / P:

06/12/2016 20:30测试测试

TESTTEST

06/12/2019 20:30 abbs abcbcb abcbc

06/11/2016 20:30测试

i123312331233123312331233123312331233123312331233Test

06/12/2016 20:30 abc

O / P:

06/12/2016 20:30 Test Test TestTestTest

06/12/2019 20:30 abbs abcbcb abcbc

06/11/2016 20:30测试## testi123312331233123312331233123312331233123312331233Test