Sed は、2 番目のパターンではなく、1 番目のパターンを含む 2 つのパターン間の線をマージします。両方のパターンが同じです。

Sed は、2 番目のパターンではなく、1 番目のパターンを含む 2 つのパターン間の線をマージします。両方のパターンが同じです。
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ちなみに、-nPerlのsed-nオプションと同じです(「読み取り、処理するが自動的に印刷しない」ループ)。

man perlrunこれらおよびオプションの詳細についてはを参照-0してください。-p-n

おすすめ記事