繁体   English   中英

“ sed”命令删除与第一个单词完全匹配的行

[英]“sed” command to remove a line that matches an exact string on first word

我在这里找到了我的问题的答案: “ sed”命令删除与第一个单词完全匹配的行

...但这只是部分原因,因为该解决方案仅在我完全像回答者所回答的那样查询时才有效。

他们回答:

 sed -i "/^maria\b/Id" file.txt

...只剪掉其中以“玛丽亚”一词开头的行,如果不是例如第一个单词,则不剪玛丽亚。

我想在文件中截取一个特定的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

当我为cnn.com使用grep时,我看到了所有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

. 是正则表达式中的元字符,表示“匹配任何一个字符”。 因此,您意外创建了一个正则表达式,该正则表达式还将捕获cnnPcomcnn comcnn\\com 尽管它可能满足您的需求,但最好更加明确:

  sed -r '/^cnn\.com\b/d' raw.txt 

此处的区别是\\之前的反斜杠. 期。 这转义了期间元字符,因此将其视为文字期间。


至于以空格开头的行,您可以在单个正则表达式中捕获它们(再次转义句点元字符):

  sed -r '/(^[ ]*|^)127\.0\.0\.1\b/d' raw.txt

这个(^[ ]*|^)表示以任意数量的重复空格^[ ]* OR |开头的行| ^开头,然后是127.0.0.1的匹配项。


然后将它们串在一起,您可以使用| 括号内的OR运算符可捕获您的所有匹配项:

  sed -r '/(^[ ]*|^)(127\.0\.0\.1|cnn\.com|0\.0\.0\.0)\b/d' raw.txt

或者,您可以使用; 以分号分隔不同的正则表达式:

  sed -r '/(^[ ]*|^)127\.0\.0\.1\b/d; /(^[ ]*|^)cnn\.com\b/d; /(^[ ]*|^)0\.0\.0\.0\b/d;' raw.txt

sed不能理解字符串的匹配,只能理解正则表达式,而且很难使sed像它一样起作用,这很可笑,请参见使用sed是否可以可靠地转义正则表达式元字符 删除第一个以空格分隔的单词为“ foo”的行仅是:

awk '$1 != "foo"' file

删除以“ foo”或“ bar”中任何一个开头的行仅是:

awk '($1 != "foo") && ($1 != "bar")' file

如果您只有几个单词,那么方法是列出所有单词并创建一个由它们索引的哈希表,然后测试行的第一个单词作为哈希表的索引:

awk 'BEGIN{split("foo bar other word",badWords)} !($1 in badWords)' file

如果这不是您想要的,那么请编辑您的问题以阐明您的要求,并包括简洁,可测试的样本输入以及给定输入预期输出。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM