次の文字列を考えてみましょう。
文書
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