如何让“sed”在查找短语时具体化

如何让“sed”在查找短语时具体化

我正在使用“sed”在文本文件中查找和删除短语。它工作得很好,但我似乎无法让它变得具体。例如,这是我的“sed”命令:

sed -i 's/foobox.com//' ~/Foo/fooman.txt

我在 ~/Foo/fooman.txt 中寻找 6 个特定短语

他们是:

dl-web.foobox.com
dl.foobox.com
foobox.com
fooboxdownloads.com
www.foobox.com
www.fooboxdownloads.com

当我运行时,sed -i 's/foobox.com//' ~/Foo/fooman.txt它会找到每个带有“foobox.com”的条目并将其删除,但将剩余的条目保留在那里(即“dl-web”、“dl”、“downloads.com”、“www”、“www.downloads.com”)。

我可以让“sed”在搜索短语时使用“通配符”吗?如果可以,通配符应该放在哪里(我已经尝试过 (*),但不起作用)。如果不使用通配符,“sed”是否可以使用其他方法来获取具体信息(dl-web.foobox.com),而不仅仅是一般信息(foobox.com)?id“sed”无法解决问题,是否有其他 CI 命令可以解决问题?

感谢您的帮助,我是 Linux 新手,正在编写 CI 命令。

答案1

这取决于字符串如何分隔

说你是由空格分隔的,那么像这样的事情可能会奏效:

sed 's/ .*foobox.*\.com / /g'

'g' 将确保如果一行中有多个匹配项,则所有匹配项都将被替换

经过测试

DEF  dl-web.foobox.com XYZ
DEF dl.foobox.com XYZ
DEF  foobox.com XYZ
DEF  fooboxdownloads.com XYZ
DEF  www.foobox.com XYZ
DEF  www.fooboxdownloads.com XYZ 

生产

DEF XYZ
DEF XYZ
DEF XYZ
DEF XYZ
DEF XYZ
DEF XYZ 

答案2

[[:alnum:].-]将匹配字母或数字字符,或.-。在它后面加上*,它将匹配零个或多个(贪婪)。这可能应该涵盖主机名中的可能字符。还要注意 匹配.任何字符,因此如果您只想匹配.,则需要用 对其进行转义\,或将其括在[and中](即:\.[.])。所以:

sed -i 's/[[:alnum:].-]*foobox\.com[[:alnum:].-]*//g' file

可能正是您想要的。请注意,GNU 和 BSD sed 的非标准-i选项不编辑文件,它取代文件。对于你的情况可能无关紧要,但请注意,如果任何文件是链接,这些链接将被破坏。如果确实有关系,请考虑使用基于命令的文件编辑器,例如edex

http://xrl.us/sedintro#uh-0对 sed 进行了很好的介绍。

答案3

你能用 grep 代替吗?命令

cat ~/Foo/fooman.txt | grep -v foobox.com

将删除所有包含短语 foobox.com 的行。这是您想要执行的操作吗?

相关内容