4

Linux システムで sed を使用して複数の行を置き換えようとしています

ここに私のファイルがあります

<!-- PAGE TAG -->
DATA1
DATA2
DATA3
DATA4
DATA5
DATA6
<div id="DATA"></div>
DATA8
DATA9
<!-- PAGE TAG -->

私が行って失敗した試み!

sed -n '1h;1!H;${;g;s/<!-- PAGE TAG -->.*<!-- PAGE TAG -->//g;p;}' 
sed -n '1!N; s/<!-- PAGE TAG -->.*<!-- PAGE TAG -->// p'
sed -i 's|<!--[^>]*-->[^+]+<!--[^>]*-->||g' 
sed -i 's|/\/\/<!-- PAGE TA -->/,/\/\/<!-- PAGE TA -->||g'

間にあるものはすべて<!-- PAGE TAG -->交換する必要があります。

この質問はsed multiline replace に似 ています

4

2 に答える 2

4

@nhahtdh の回答は元の質問に対する正しい回答ですが、この解決策はコメントに対する回答です。

sed '
  /<!-- PAGE TAG -->/,/<!-- PAGE TAG -->/ {
    1 {
      s/^.*$/Replace Data/
      b
    }
    d
  }
'

次のように読むことができます。

/<!-- PAGE TAG -->/,/<!-- PAGE TAG -->/-> これらの正規表現の間の行について

1 {-> 一致する最初の行

s/^.*$/Replace Data/->何かを検索して置き換えますReplace Data

b-> 終了への分岐 (この場合、break のように動作します)

d-> それ以外の場合は、行を削除します

各コマンドの後にセミコロンを追加することで、一連の sed コマンドを gnu sed でワンライナーにすることができます (ただし、後で読みたい場合はお勧めしません)。

sed '/<!-- PAGE TAG -->/,/<!-- PAGE TAG -->/ { 1 { s/^.*$/Replace Data/; b; }; d; };'

余談ですが、投稿はできるだけ具体的にするようにしてください。「置換/削除」とは、「置換または削除」を意味します。交換したい場合は、交換済みと言ってください。これは、あなたの質問に答えようとしている私たちと、同じ問題を経験している可能性のある将来のユーザーの両方に役立ちます.

于 2012-06-15T01:33:16.133 に答える
4

あなたが見るリンクで与えられた答えから適応すると、これはうまくいくはずです:

sed '/<!-- PAGE TAG -->/,/<!-- PAGE TAG -->/d'

正規表現の形式は[2addr]dで、2 つのアドレスは/<!-- PAGE TAG -->//<!-- PAGE TAG -->/であり、カンマで区切られています。dは、最初のアドレスに一致する行から最後のアドレスに一致する行までのすべての行を削除することを意味します。(タグ外のものを意味しますが、タグと同じ行のものも削除されます)。


Tim Pote が質問に答えていますが、誰かが複数行のパターンを置き換える必要がある場合に備えて、ここに投稿します。

sed -n '1h; 1!H; ${g; s/<!-- PAGE TAG -->[^!]*<!-- PAGE TAG -->//g; p;}'

既存のソースからソリューションを変更したため、コマンドのほとんどはここで説明されています。

ここでの正規表現は!、2 つのページ タグ間のデータに文字がないと想定しているため、少し不安定です。この仮定がなければ、(私が知る限り)遅延量指定子がないため、正規表現に一致する文字数を制御することはできません。

このソリューションでは、タグと同じ行にある場合でも、タグの前のテキストは削除されません。

于 2012-06-15T01:06:02.190 に答える