Sed 合并两个不同模式之间的分割线

Sed 合并两个不同模式之间的分割线

我想合并 ^pattern2 和它的 "; 之间的行。

改变这个:

pattern2
"xxx xxxxxx xxxxxxxx";
pattern2 "xxxx xxxxxxx xxxxxxxxx xxxxxxxxx";
pattern2 
"xxxx xxxxxxx xxxxxxxxx xxxxxxxxx
yyyy yyyyyy yy yyyyyyyyyy yyyyyyy";
pattern3
"xxx xxxxxx xxxxxxxx
xxx xxxxxx xxxxxxxx";
pattern2
"xxx xxxxxx xxxxxxxx";

pattern2 "xxx xxxxxx xxxxxxxx";
pattern2 "xxxx xxxxxxx xxxxxxxxx xxxxxxxxx";
pattern2 "xxxx xxxxxxx xxxxxxxxx xxxxxxxxx yyyy yyyyyy yy yyyyyyyyyy yyyyyyy";
pattern3
"xxx xxxxxx xxxxxxxx
xxx xxxxxx xxxxxxxx";
pattern2 "xxx xxxxxx xxxxxxxx";

我以前用过这个 sed 命令

sed -i -e '/^pattern2/!b' -e :a -e 'N;/\;/!ba' -e 's/\n/ /g' input_file

但在这种情况下它给出了这个输出:

pattern2 "xxx xxxxxx xxxxxxxx";
pattern2 "xxxx xxxxxxx xxxxxxxxx xxxxxxxxx"; pattern2 
"xxxx xxxxxxx xxxxxxxxx xxxxxxxxx
yyyy yyyyyy yy yyyyyyyyyy yyyyyyy";
pattern3
"xxx xxxxxx xxxxxxxx
xxx xxxxxx xxxxxxxx";
pattern2 "xxx xxxxxx xxxxxxxx";

谢谢

答案1

怎么样

$ sed '/^pattern2/{
:1
/;$/b
N
s/\n/ /
t1
}' file
pattern2 "xxx xxxxxx xxxxxxxx";
pattern2 "xxxx xxxxxxx xxxxxxxxx xxxxxxxxx";
pattern2  "xxxx xxxxxxx xxxxxxxxx xxxxxxxxx yyyy yyyyyy yy yyyyyyyyyy yyyyyyy";
pattern3
"xxx xxxxxx xxxxxxxx
xxx xxxxxx xxxxxxxx";
pattern2 "xxx xxxxxx xxxxxxxx";

作为单行

sed '/^pattern2/{:1;/;$/b;N;s/\n/ /;t1;}' file

答案2

使用GNU sed转入其扩展正则表达式模式 ( -E):

sed -E '
  /^pattern2(.*[^;])?$/{
    N;H;z;x;D
  }
  y/\n/ /
' file

答案3

sed '/^pattern2/{/;$/b; :a N;//!ba;y/\n/ /}' test

对于以 开头pattern2但不以 结尾的任何行;,启动一个循环,将新行放入缓冲区,直到遇到以 结尾的行;。当满足此条件时,用空格替换所有出现的新行。然后执行默认操作:打印。

如果你确定 ;嵌入双引号内(在 的位置x),您可以短sed接:

sed '/^pattern2[^;]*$/{:a N;/;$/!ba;y/\n/ /}' test 

答案4

使用 GNU awk 进行多字符 RS 和\s速记:

$ awk 'BEGIN{RS=ORS="\";\n"; FS="\\s*\n\\s*"} /^pattern2/{$1=$1} 1' file
pattern2 "xxx xxxxxx xxxxxxxx";
pattern2 "xxxx xxxxxxx xxxxxxxxx xxxxxxxxx";
pattern2 "xxxx xxxxxxx xxxxxxxxx xxxxxxxxx yyyy yyyyyy yy yyyyyyyyyy yyyyyyy";
pattern3
"xxx xxxxxx xxxxxxxx
xxx xxxxxx xxxxxxxx";
pattern2 "xxx xxxxxx xxxxxxxx";

请注意,上面的内容会产生问题的预期输出,而当前的 sed 答案不会产生,因为它们的第三个输出行将以pattern2<blank><blank>"xxxx而不是开头pattern2<blank>"xxxx。即使任何带引号的字符串;在行尾包含 sed 答案都会失败的情况下,它也将起作用,例如给定此输入(请注意;带引号的字符串内第五行末尾的 ):

$ cat file
pattern2
"xxx xxxxxx xxxxxxxx";
pattern2 "xxxx xxxxxxx xxxxxxxxx xxxxxxxxx";
pattern2
"xxxx xxxxxxx xxxxxxxxx xxxxxxxxx;
yyyy yyyyyy yy yyyyyyyyyy yyyyyyy";
pattern3
"xxx xxxxxx xxxxxxxx
xxx xxxxxx xxxxxxxx";
pattern2
"xxx xxxxxx xxxxxxxx";

$ awk 'BEGIN{RS=ORS="\";\n"; FS="\\s*\n\\s*"} /^pattern2/{$1=$1} 1' file
pattern2 "xxx xxxxxx xxxxxxxx";
pattern2 "xxxx xxxxxxx xxxxxxxxx xxxxxxxxx";
pattern2 "xxxx xxxxxxx xxxxxxxxx xxxxxxxxx; yyyy yyyyyy yy yyyyyyyyyy yyyyyyy";
pattern3
"xxx xxxxxx xxxxxxxx
xxx xxxxxx xxxxxxxx";
pattern2 "xxx xxxxxx xxxxxxxx";

相关内容