
[英]sed or perl Remove outer parentheses only if first inner word matches
[英]“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
的.
是正则表达式中的元字符,表示“匹配任何一个字符”。 因此,您意外创建了一个正则表达式,该正则表达式还将捕获cnnPcom
或cnn com
或cnn\\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.