在文件中搜索多个模式,如果匹配则删除该行

7
例如,一个文件包含以下内容:
10.45.56.84 raj
10.49.31.81 mum
10.49.31.86 mum
10.81.51.92 guj
10.45.56.116 raj
10.45.56.84 raj

我想在上述文件中搜索10.45.56.8410.81.51.92,如果匹配模式,则删除该行。

同时,我想用单个命令完成此操作。


2
欢迎来到Stack Overflow!我们鼓励您研究问题。如果您已经尝试过某些方法,请将其添加到问题中 - 如果没有,请先研究和尝试您的问题,然后再回来。 - user647772
5个回答

11

另一种解决方案:

 awk '!/10.45.56.84|10.81.51.92/' file

6
这也将删除行:10145x56y84。对于给定的输入可能还可以接受,但awk '!/10\.45\.56\.84|10\.81\.51\.92/'会更准确。 - William Pursell

6
你可以这样做:
sed -e '/10[.]45[.]56[.]84/d;/10[.]81[.]51[.]92/d' file

这里有两个sed "d"删除命令,由一个分号分隔。但是,只有在它们匹配各自的模式(斜杠之间的模式),并且命令在此之前时,它们才会被执行。

你也可以使用grep:

grep -Ev '10[.]45[.]56[.]84|10[.]81[.]51[.]92' file

“-v”标志告诉grep只打印不匹配模式的行,并且我们使用OR运算符“|”来匹配任一模式。使用“-E”标志,这样我们就不必用反斜杠转义OR运算符。
在两种情况下,我们将句点放在括号中,否则句点会被用作匹配任何字符的运算符。您可以在单个括号对中放置更多字符,它们将被解释为匹配其中之一的字符。
希望这有所帮助=)

sed 命令中,如果第一个比较成功,则无需执行第二个比较。它可以工作(并且因此得到 +1),但是您可以使用 b 指令在那里开始下一个循环:sed -e '/10[.]45[.]56[.]84/ { d; b }; /10[.]81[.]51[.]92/d' - Birei
“d”命令实际上启动了下一个循环。这也是可能会出现意外行为的事情。“D”命令的行为方式相同,但仅删除到第一个换行符,重新启动循环,但仅在模式空间变为空时加载下一行。许多时候,我不得不执行“s / [^ \ n] * //”,只是为了模仿“D”命令,但不启动下一个循环。感谢反馈! - Janito Vaqueiro Ferreira Filho

4
这可能适用于您(GNU sed):
sed -r '/10\.(45\.56\.84|81\.51\.92)/d' file

4
grep -Fv -f <(echo $'10.45.56.84\n10.81.51.92') filename

谢谢您不必转义所有内容! - TCB13

0

awk -F " " '{if($1 != "10.45.56.84") if($1 != "10.81.51.92" ) { print $0;}}' inputFile > OutputFile

解释:awk是一种用于操作数据和生成报告的脚本语言。

" ":它用作分隔符。如果数据由|分隔,则需要像"| "这样说明。

{if($1 != "10.45.56.84") if($1 != "10.81.51.92" ) { print $0;}}':模式(条件)并在outputFile中打印。


虽然这段代码片段可能解决了问题,但包括解释真的有助于提高您的帖子质量。请记住,您正在为未来的读者回答问题,而这些人可能不知道您的代码建议原因。同时,请尽量不要在代码中添加过多的解释性注释,因为这会降低代码和解释的可读性! - Blue

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接