2

sed または awk を使用してファイル内の空白行 (改行、タブ、およびスペース) を削除したいのですが、これらの空白行が 2 つのパターンの間にある場合に限ります。

lorem lorem PATTERN1

\t

PATTERN2 lorem2 lorem2`

両方のパターンで 2 行を連結した以下の結果が期待されます。

lorem lorem PATTERN1PATTERN2 lorem2 lorem2
4

4 に答える 4

5

これはうまくいくかもしれません(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 番目のパターンの間のすべてのスペース、タブ、および改行を置き換えます。
于 2013-02-23T19:59:54.817 に答える
1

@WilliamPursellのperlスクリプトに相当するGNU awk:

awk -v RS='\0' '{print gensub(/(PATTERN1).*(PATTERN2)/,"\\1\\2","g")}' file
于 2013-02-26T13:55:57.620 に答える
0

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'
于 2013-02-23T22:13:16.923 に答える
0

@ user537723: awk を試すことができます:

---以前の投稿を改善したため、パターン間で 1 行に印刷されます---

awk '/PATTERN1/{ORS=x} /PATTERN2/{ORS=RS} ORS || NF' file
于 2013-02-23T22:19:54.713 に答える