4

sedファイルからhtmlコードのブロックを削除するために使用しようとしています。削除するブロックがファイル内で複数回出現し、複数の行にまたがっています。また、ブロックの内容は異なりますが、明確な開始と終了の線引きがあります。

私はこれを機能させるために多くのアプローチを試みましたが、怠惰が機能しsed、行間で一致する問題に直面しています。

これが私がやろうとしていることの例です:

good stuff a
good stuff same line START
bad stuff 1.0
bad stuff 1.1
END
good stuff b
good stuff b
good stuff same line START bad stuff 2.0
bad stuff 2.0
END
good stuff c

なる:

good stuff a
good stuff same line
good stuff b
good stuff b
good stuff same line
good stuff c

これまでに試したいくつかのアプローチを次に示します。

sed -n '1h;1!H;${;g;s/START.*END//mg;p;}' < test > test2 境界を越えて機能します。

sed -n 's/START[^END]*END//g' < test > test2E または N または D のみを否定します。

sed -n 's/START.*?END//g' < test > test2怠惰に振る舞わない。

ありがとうございました。

4

5 に答える 5

2

sed は、複数行の入力を処理するのには適していません。代わりに awk を使用してください。
行を正規表現に一致させ、それが「不良」ブロックの始まりである場合は印刷をオフにします。ファイルの例を次に示します。

$ awk '
BEGIN    { pr = 1; }
/^START/  { pr = 0; }
          { if (pr) print; }
/^END/    { pr = 1; }
' < yourfile
good stuff a
good stuff b
good stuff b
good stuff c
于 2013-02-01T20:22:26.090 に答える
1

これはうまくいくかもしれません(GNU sed):

sed '/START/!b;:a;/END/bb;$!{N;ba};:b;s/START.*END//' file
于 2013-02-01T23:06:46.960 に答える
1

それを行うのsedは難しいかもしれません。2 つsedの s で簡単になります。

sed 's/START/\nSTART\n/g' | sed '/START/,/END/d'

于 2013-02-01T21:40:09.913 に答える
1

どうですか:

$ sed '/START/,/END/d' file.txt
good stuff a
good stuff b
good stuff b
good stuff c

ここについてもっと読むranges

于 2013-02-01T20:11:54.783 に答える
0

sed は、単一行での単純な置換のための優れたツールです。それ以外の場合は awk を使用します。

$ awk 'sub(/START.*|.*END/,""){f=!f;if(NF)print;next} !f' file
good stuff a
good stuff same line
good stuff b
good stuff b
good stuff same line
good stuff c
于 2013-02-02T14:46:30.320 に答える