私のファイルにテキストが多すぎます。===
シンボルとの間のすべてのテキストを削除したいです<!!!>
。たとえば、コマンドを実行した後でText ===some comments<!!!> lala ===aaa<!!!>"
なければなりません。Text lala
私はそれを試しましたが、うまくsed -i -E "s/(===(.*)<!!!>)//" file
いきませんでした。
編集する:
Text ===
some commenkjghkb
ufjhbgdfxjhg
srtdfts
</!!!>
lala ===aaa
</!!!>"```
しなければならないText lala
答え1
Perl正規表現を使用するとできます欲はないマッチ:
perl -pe 's/===.*?<!!!>//g' file
編集1:テキストを挿入するには、次のようにします。
perl -pe 's/===.*?<!!!>/Text you want to insert/g' file
編集2:複数行コメントを処理する必要がある場合は、次のものを使用することもできます。
perl -pe 'BEGIN{undef $/;} s|===.*?</!!!>|insert|gs' file
s
改行文字にも一致する修飾子を使用する必要があります.
。入力区切り文字であるperl変数は$/
undefに変更する必要があります。これは「フルルック音」モードとも呼ばれます。
答え2
sed
Non-greedyはサポートされていません*
。次のトリックを使用する必要があります。
sed 's/_/_u/g;s/|/_p/g;s/<!!!>/|/g
s/===[^|]*|//g
s/|/<!!!>/g;s/_p/|/g;s/_u/_/g'
またはいくつかのsed
実装を介して:
sed 's/<!!!>/\
/g; s/===[^\n]*\n//g; s/\n/<!!!>/g'
編集による複数行の一致をサポートするには、最新バージョンのGNU sedで最初のwith-z
オプションを使用するか(ファイルにNUL文字が含まれていないと仮定)、次のようなものを使用できます。
sed ':1
$!{
N
b1
}
s/_/_u/g;s/|/_p/g;s/<!!!>/|/g
s/===[^|]*|//g
s/|/<!!!>/g;s/_p/|/g;s/_u/_/g'