正規表現を使用してファイルからテキストを削除する

正規表現を使用してファイルからテキストを削除する

私のファイルにテキストが多すぎます。===シンボルとの間のすべてのテキストを削除したいです<!!!>。たとえば、コマンドを実行した後で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

sedNon-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'

関連情報