如何用 sed 删除两个字符之间的所有内容?

如何用 sed 删除两个字符之间的所有内容?

我有一个文件,总共包含 482 行,我想要删除~~广告*~~从。内容如下所示:

478|~~adt00000aa9~~~~adt0000000b~~14395189_p0.jpg
479|~~adt00000995~~44836628_p0.jpg
480|~~adt00000aae~~Miku_Collab_2_by_Luciaraio.jpg

我尝试过sed 's/~~adt*~//' file > new_file,但它并没有删除所有内容。

如何删除第一个和最后两个 ~~ 符号之间的所有内容?

答案1

鉴于您想要删除~~adt(something)~~并且其他行上可能有~~(something different)~~(问题中未显示):

$ sed 's/~~adt[^~]*~~//g' file.in >file.out

对于给定的数据,这将生成

478|14395189_p0.jpg
479|44836628_p0.jpg
480|Miku_Collab_2_by_Luciaraio.jpg

adt将最后一行的更改为xxx,该命令生成

478|14395189_p0.jpg
479|44836628_p0.jpg
480|~~xxx00000aae~~Miku_Collab_2_by_Luciaraio.jpg

该模式~~adt[^~]*~~将匹配所有出现的~~adt后跟任意数量的不是 的字符~,然后~~再次匹配。最后/g的 将会确保每行上的所有此类匹配都被删除。

答案2

adt*表示a后面跟着d任意数量的 ,t包括 0。

点匹配任何字符,所以使用

~~adt.*~

匹配~~adt后跟任意数量(包括 0)个字符,后跟~.

答案3

你可以试试这个:

sed 's/~.*~//' file > file_new

输出将:

478|14395189_p0.jpg
479|44836628_p0.jpg
480|Miku_Collab_2_by_Luciaraio.jpg

相关内容