4

私は2つのパターンの間でテキストを除外しようとしています.12の例を見てきましたが、私が望むものを正確に得ることができませんでした:

サンプル入力:

START LEAVEMEBE text
   data
START DELETEME text
   data
   more data
   even more
START LEAVEMEBE text
   data
   more data

START DELETEME text
   data
   more

SOMETHING that doesn't start with START
@ sometimes it starts with characters that needs to be escaped...

私は一緒にいたい:

START LEAVEMEBE text
   data
START LEAVEMEBE text
   data
   more data


SOMETHING that doesn't start with START
@ sometimes it starts with characters that needs to be escaped...

私はsedを実行しようとしました:

sed 's/^START DELETEME/,/^[^ ]/d'

そして、包括的な削除を取得したので、「除外」を追加してみました (この構文を本当によく理解しているかどうかはわかりません):

sed 's/^START DELETEME/,/^[^ ]/{/^[^ ]/!d}'

しかし、私の「START DELETEME」行はまだそこにあります (はい、grep できますが、それは見苦しいです :) 加えて、このサンプルの空の行も削除します。私の終了パターンはそのままです)単一のsedコマンドでそれを行う方法があるかどうか疑問に思っています。これをうまく行う awk スクリプトがあります。

BEGIN { flag = 0 }
        {
                if ($0 ~ "^START DELETEME")
                        flag=1
                else if ($0 !~ "^ ")
                        flag=0

                if (flag != 1)
                        print $0
        }

しかし、ご存知のように、「A はカタツムリのように実行される awk です」。それは永遠にかかります。

前もって感謝します。デイブ。

4

3 に答える 3

0

私は awk に固執します:

awk '
/LEAVE|SOMETHING/{flag=1} 
/DELETE/{flag=0} 
flag' file

それでも sed を好む場合は、別の方法があります。

sed -n '
/LEAVE/,/DELETE/{
       /DELETE/b
        p
     }
' file
于 2013-06-13T08:53:31.990 に答える