我想合并 ^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";