3

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

我有一个格式为:

          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

4 回答 4

7

这可能对您有用(GNU sed):

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

解释:

  • $!N除非最后一行将下一行附加到模式空间。
  • s/\n\s*{\s*$/{/用一个左大括号替换一个换行符,后跟没有或任何数量的空格,然后是一个左大括号,然后是没有或任何数量的空格,直到字符串的末尾。
  • P打印到并包括第一个换行符。
  • D删除直到并包括第一个换行符(如果是这样,不要开始新的循环)。
于 2012-07-23T10:06:00.007 回答
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; ...

高温高压

于 2012-07-23T11:23:18.950 回答
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; ...
于 2012-07-23T10:20:04.077 回答
0

[shyam@localhost ~]$ perl -lne 's/^/\n/ if $.>1 && /^\d+/; printf "%s",$_' appendDateText.txt

那可行

i/p:

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

测试一下

2019 年 6 月 12 日 20:30 abbs abcbcb abcbc

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

i123312331233123312331233123312331233123312331233Test

2016 年 6 月 12 日 20:30 美国广播公司

o/p:

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

2019 年 6 月 12 日 20:30 abbs abcbcb abcbc

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

于 2017-10-05T12:29:59.913 回答