bashを使用して複数行文字列を削除する方法は?

bashを使用して複数行文字列を削除する方法は?

次の文字列を考えてみましょう。

文書

This is some text
<#
Love this or that
#>
He is running like a rabbit

たとえば、改行文字列IDをgrepするには、次のようにします。

cat file | grep -Pzo '(?s)<#.*?#>'

すると、以下が出力されます。

<#
Love this or that
#> 

しかし、私がしたい場合はどうですか?削除する大会?どうすればいいですか?

答え1

あなたはこれを行うことができますsed

sed '/<#/,/#>/d' file

2 つの特定の文字列間のテキストを削除します。

答え2

-P(GNU拡張)はP実際にはerl正規表現用なので、次のようになります。

<file perl -0777 -pe 's/<#.*?#>//sg'

答え3

必要でない場合は、grep次のことができますawk

awk 'BEGIN {p=1}; $1 == "<#" {p=0}; $1 == "#>" {p=1; next}; p == 1 {print}' file

pこれにより、起動時に内部フラグが1に設定され、0「除外開始」パターンが見つかった場合は1に設定され、「除外終了」が見つかった場合は再び1に設定されます。次に、pが1の行だけを印刷します。next終了パターンが印刷されるのを防ぐには、終了と一致するために使用される規則の文が必要です。

答え4

これがエレガントなのかわかりません。私はそれについて考えた。

tr "\n" "%" < file | sed -e 's/<#%.*#>%//' | tr "%" "\n"

新しい行を次に置き換えます。%

tr "\n" "%"

以下のすべてを交換してください<#%...#>%

sed -e 's/<#%.*#>%//'

%新しい行に置き換えます。

tr "$" "\n"

出力:

This is some text
He is running like a rabbit

関連情報