其实我正在使用
sed -e s/Perro-A//g -i *-a.log
从许多以 *-a.log 结尾的文件中删除字符串 Perro-A。
但有时我的文件中可能没有 Perro-A;我可能有 Perro-B、Perro-C、Perro-14、Perro-X、Perro-DHFN 等字符串。
我需要更新之前的命令以删除以“Perro”开头的任何字符串。我怎样才能做到这一点?
答案1
假设您只想删除所有以“Perro”开头的字符串,您可以使用:
sed 's/Perro[^ ]*//g' *-a.log
如果您想就地编辑文件,可以使用-i
带有 的选项sed
,例如
sed -i sed 's/Perro[^ ]*//g' *-a.log
更新
如果你不想有多个空格,你可以使用:
sed -i sed 's/Perro[^ ]*//g' *-a.log | tr -s " "
样本数据,
rahul@rahul: cat a.log
Foo Perro-B Perro-C Bar
Perro-14 cmd Perro-X
Perro-DHFN abc xyz
aBcD Perro-14
rahul@rahul: sed 's/Perro[^ ]*//g' a.log | tr -s " "
Foo Bar
cmd
abc xyz
aBcD
答案2
例如,如果您想将 Perro-* 一词删除到下一个空格,您可以使用:
sed -ie 's/Perro-.*\s//g' *-a.log
样本:
cat /tmp/foo
Prefix Perro-A Suffix
Pre Perro-B Suf
sed -ie 's/Perro-.*\s//g' /tmp/foo
cat /tmp/foo
Prefix Suffix
Pre Suf
请注意,sed 不处理非贪婪过滤。
另一种方法是用于perl
该工作:
cat /tmp/foo
Prefix Perro-A c Perro-B Suffix
Perro-C Pre Suf Perro-D
perl -i -pe 's/Perro-.*?\s//g' /tmp/foo
cat /tmp/foo
Prefix c Suffix
Pre Suf
答案3
您距离自己的答案只有几个字符:
sed -i -e 's/Perro.*//g' *-a.log
(我把-i
前面的内容移到前面只是为了让读者尽早明白我们正在进行就地编辑)。这将删除任何字符串包含字符串“Perro”,后跟任意(或无)数量的字符 ( .*
)。
相反,如果您想删除以下字符串开始与“Perro”,那么你只需要锚定字符串^
:
sed -i -e 's/^Perro.*//g' *-a.log
兰伯特在这里的评论中提出了很好的澄清观点;上面的 sed 语句从该行中删除字符串,但保留(现在可能为空白)行。相反,如果您希望 sed 删除包含 Perro 的行,那么他有正确的语法:
sed -i -e '/Perro/d' *-a.log
...或者类似地,删除该行,如果开始与佩罗:
sed -i -e '/^Perro/d' *-a.log