sed または awk を使用してファイル内の空白行 (改行、タブ、およびスペース) を削除したいのですが、これらの空白行が 2 つのパターンの間にある場合に限ります。
lorem lorem PATTERN1
\t
PATTERN2 lorem2 lorem2`
両方のパターンで 2 行を連結した以下の結果が期待されます。
lorem lorem PATTERN1PATTERN2 lorem2 lorem2
これはうまくいくかもしれません(GNU sed):
sed -r '/PATTERN1/!b;:a;/PATTERN2/bb;$!{N;ba};:b;s/(PATTERN1.*)[ \t\n]+(.*PATTERN2)/\1\2/;tb' file
/PATTERN1/!b
最初のパターンが含まれていない限り、行を印刷するだけです:a;/PATTERN2/bb;$!{N;ba}
2 番目のパターンに遭遇するまで、後続の行をパターン スペース (PS) に読み込みます。:b;s/(PATTERN1.*)[ \t\n]+(.*PATTERN2)/;tb
最初のパターンと 2 番目のパターンの間のすべてのスペース、タブ、および改行を置き換えます。@WilliamPursellのperlスクリプトに相当するGNU awk:
awk -v RS='\0' '{print gensub(/(PATTERN1).*(PATTERN2)/,"\\1\\2","g")}' file
PATTERN1 と PATTERN2 を含む行の間の空白のみを含む行を削除するだけの場合は、次のようにします。
sed '/PATTERN1/,/PATTERN2/{ /^[ \t]*$/d}'
あなたが提供する出力例では、PATTERN1 に続く改行も削除したいようですが、入力を次のように処理する方法が明確ではありません。
PATTERN1
non-empty-line
PATTERN2
どのように処理したいかも
PATTERN1 non-whitesapce
PATTERN2
おそらく、質問の明確化が必要です。pattern1
との間のすべての空白を本当に削除したい場合はpattern2
、おそらく次の方法が最も簡単です。
perl -0777 -pe 's/(pattern1)\s*(pattern2)/$1$2/g'
@ user537723: awk を試すことができます:
---以前の投稿を改善したため、パターン間で 1 行に印刷されます---
awk '/PATTERN1/{ORS=x} /PATTERN2/{ORS=RS} ORS || NF' file