【发布时间】:2018-08-30 01:31:08
【问题描述】:
我在这里找到了我的问题的答案:"sed" command to remove a line that match an exact string on first word
...但仅部分是因为该解决方案仅在我查询与回答的人所回答的答案完全相同的情况下才有效。
他们回答:
sed -i "/^maria\b/Id" file.txt
...仅删除以“maria”开头的一行,如果不是第一个单词,则不删除maria。
我想删除文件中的特定 url,例如:“cnn.com” - 但是,我也有一堆本地主机地址,0.0.0.0 并且都有一些前面有一个空格。我也不想删除 ads.cnn.com 之类的子域,以便代码“应该”工作,但当我使用 -e 选项输入更多命令时不会。我下面的代码似乎可以很好地清理东西,只是我无法让它破坏 cnn.com!我的文件名为 raw.txt
sed -r -e 's/^127.0.0.1//' -e 's/^ 127.0.0.1//' -e 's/^0.0.0.0//' -e 's/^ 0.0.0.0//' -e '/#/d' -e '/^cnn.com\b/d' -e '/::/d' raw.txt | sort | tr -d "[:blank:]" | awk '!seen[$0]++' | grep cnn.com
当我 grep 搜索 cnn.com 时,我看到了所有 cnn,包括我不想要的那个实际上是“cnn.com”。
ads.cnn.com
cl.cnn.com
cnn.com <-- the one I don't want
cnn.dyn.cnn.com
customad.cnn.com
gdyn.cnn.com
jfcnn.com
kermit.macnn.com
metrics.cnn.com
projectcnn.com
smetrics.cnn.com
tiads.sportsillustrated.cnn.com
trumpincnn.com
victory.cnn.com
xcnn.com
如果我只是将那一段代码与 cnn.com 一起使用,它似乎可以工作。
sed -r '/^cnn.com\b/d' raw.txt | grep cnn.com
* I'm not using the "-e" option
结果:
ads.cnn.com
cl.cnn.com
cnn.dyn.cnn.com
customad.cnn.com
gdyn.cnn.com
jfcnn.com
kermit.macnn.com
metrics.cnn.com
projectcnn.com
smetrics.cnn.com
tiads.sportsillustrated.cnn.com
trumpincnn.com
victory.cnn.com
xcnn.com
当我将命令与“-e”选项串在一起时,我所做的一切似乎都不起作用。我需要一些帮助才能让我的多选项命令与 SED 一起发挥作用。
有什么建议吗?
Ubuntu 12 LTS 和 16 LTS。
sed (GNU sed) 4.2.2
【问题讨论】:
-
对于 SO 的挫折感到抱歉。如果你具体到你需要什么,我发现它对问题很有帮助。对于此类问题,值的示例列表以及您想要的结果将非常有帮助。话虽这么说,这里有很多信息可以得出一个非常彻底的答案。
-
这适用于您的示例
sed -re '{/#/d; /^cnn\.com\b/d; /::/d; s/^( ?(127\.0\.0\.1|0\.0\.0\.0))// }' -
当您发现自己在使用多个 seds 和 trs 以及 greps 和 awks 的管道时......只需将其重写为一个简单的 awk 脚本即可。