sedを使用して2つの単語の間のすべての内容を削除しますか?

sedを使用して2つの単語の間のすべての内容を削除しますか?

これうまくいかないようです

The next example would delete everything between "ONE" and "TWO:" 

#!/bin/sh
sed '
/ONE/ {
# append a line
    N
# search for TWO on the second line 
    /\n.*TWO/ {
# found it - now edit making one line
        s/ONE.*\n.*TWO/ONE TWO/
    }
}' file

1と2の間のすべてを削除したかったです。含まれているファイルを試してみました。

[user5@mailserver ~]$ cat file
ONE
hello
TWO

しかし、出力は次のようになります

[user5@mailserver ~]$ ./test
ONE
hello
TWO

ONE TWO 私はそれを修正しようとすると思ったが、それはできなかった。

答え1

これは仕事をするでしょう

sed '/^ONE/,/TWO/{/^ONE/!{/TWO/!d}}' file

/^ONE/,/TWO/ONEupで始まる最初の行を見てください。TWO

{/^ONE/!私の行が次から始まらない場合ONE

{/TWO/!d}}私の行がTWO次から始まらずに次のことをする場合delete

上記をまとめると次のようになります。

ONEupで始まるすべてを見つけてくださいTWO。別の確認を実行します。つまり、「ONE TWO」と一致しないアイテムを見つけ、and残りを削除します。

答え2

私は使用します

sed 'N;N;s/ONE.*\n.*TWO/ONE TWO/' file

これらの2つのタスクは、タスクが機能するNように3行を一緒にリンクします。s

(これは元の例と非常に似ています)。

関連情報