Input:
1:
aaa
bbb
2:
xxx
yyy,
zzz
3:
ccc
4:
5:
xxx
yyy
出力:
1: aaa bbb
2: xxx yyy, zzz
3: ccc
4:
5: xxx yyy
:$
要件:パターン1とパターン2の間のすべての行をマージします:$
(パターン1は含まれていますがパターン2は含まれません)。
正規表現の一致::$
試み:
sed '/:$/{n;:l N;/:$/b; s/\n/ /; bl}' | sed '/:$/!b;/:$/N;/:$/!{s/\n//g}' -E
ベストアンサー1
パールの使用:
$ perl -0 -pe 's/\n+/ /g;
s/ (\d+:)/\n$1/g;
s/^\n+//;
s/ +$/\n/' input.txt
1: aaa bbb
2: xxx yyy, zzz
3: ccc
4:
5: xxx yyy
(読みやすくするためにスクリプトに改行が追加されました。そのまま実行または削除して、読み取れないコードの1行を取得できます。)
- まず、1つ以上の改行のすべてのインスタンスを空白に置き換えます(注:空の行を削除/無視する追加の有用な副作用があります)。
- 次に、すべてのインスタンスの空白を置き換えます。スペース、1つ以上の数字、
:
改行文字を含む。 - 次に、文字列の先頭のすべての先頭行を削除し、文字列の末尾のすべての末尾の空白を単一の改行に置き換えます。これは、以前のs///置換操作がすべての改行を空白に置き換えたために必要です。
この-0
オプションは、Perlに入力レコード区切り文字としてNULを使用するように指示し、入力にNULが含まれていないため、入力ファイル全体を1つの長い文字列として扱います。
Perlには、「読み取り、処理、および自動印刷」ループで1行のスクリプト全体をラップする-p
ように機能させるオプションがあります。sed
ちなみに、-n
Perlのsed-n
オプションと同じです(「読み取り、処理するが自動的に印刷しない」ループ)。
man perlrun
これらおよびオプションの詳細についてはを参照-0
してください。-p
-n