Awk

Sed 合併兩個不同模式之間的分割線

  • March 19, 2022

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

謝謝

怎麼樣

$ 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

使用GNU sed其擴展正則表達式模式 ( -E):

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

引用自:https://unix.stackexchange.com/questions/695995