Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 附加到前一行以进行匹配_Bash_Shell_Sed_Awk - Fatal编程技术网

Bash 附加到前一行以进行匹配

Bash 附加到前一行以进行匹配,bash,shell,sed,awk,Bash,Shell,Sed,Awk,如果找到匹配项,是否可以使用sed或awk附加到前一行 我有一个文件,其格式如下: INT32 FSHL (const TP Buffer) { INT32 FSHL_lm (const TP Buffer) { WORD32 ugo = 0; ... 我试图做的是扫描独立的大括号{,并将其附加到前一个非空行中。在同一行中附加任何内容的大括号不应出现匹配 预期产出

如果找到匹配项,是否可以使用
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; ...
感谢您的回复。

这可能适合您(GNU sed):

说明:

  • $!N
    除非最后一行将下一行附加到图案空间
  • s/\n\s*{\s*$/{/
    将换行符后跟无空格或任意数量的空格替换为开头的大括号,在字符串末尾后跟无空格或任意数量的空格,替换为开头的大括号
  • P
    打印到并包括第一个换行符
  • D
    删除并包括第一个换行符(如果是,则不要开始新的循环)

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

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

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

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

那就行了

i/p:

2016年12月6日20:30测试

测试

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

2016年11月6日20:30测试

I1233123312331233123312331233123312331233123312331233123312331233测试

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

o/p:

2016年12月6日20:30测试

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


2016年11月6日20:30 test##test1233123312331233123312331233123312331233test

如果大括号后面有空格,regexp
!/{$/
将失败。同样对于像
[{
这样的行,因为它前面没有检查任何内容。也许OP可以接受它,但我会使用更紧的
!(NF==1&$1=“{”)< /代码>或<代码>!/^ *{*$/< />代码。@ BiRe:谢谢,你是对的。我没有考虑过比空白更重要的字符。因为某种原因,我不知道。“史提夫谢谢!我的作品!”打印行
do?@ArchStanton:如果已经定义了'line'变量,那么它将打印该变量的值。效果很好!您能给正则表达式添加一个简短的描述吗:)
!(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; ...