查找所有不带'的行;t匹配正则表达式(regex)-a';负匹配';

查找所有不带'的行;t匹配正则表达式(regex)-a';负匹配';,regex,bash,awk,match,Regex,Bash,Awk,Match,你如何匹配那些不符合某个模式的东西 尝试使用sed会产生非常尴尬的结果 如果要替换此文件: The quick brown fox leaps over the lazy dog. The swift brown fox leaps over the lazy dog. The swift green frog leaps over the lazy fox. The quick yellow dog leaps over the lazy fox. 与: The quick

你如何匹配那些不符合某个模式的东西

尝试使用sed会产生非常尴尬的结果

如果要替换此文件:

The quick brown fox leaps over the lazy dog.  
The swift brown fox leaps over the lazy dog.  
The swift green frog leaps over the lazy fox.  
The quick yellow dog leaps over the lazy fox.  

与:

The quick brown fox jumps over the lazy dog.    
The swift brown fox jumps over the lazy dog.    
The quick yellow dog jumps over the lazy fox.    


做这件事的优雅方式是什么?

我建议使用awk

您的数据保存在“输入文件”中:

The quick brown fox leaps over the lazy dog.  
The swift brown fox leaps over the lazy dog.  
The swift green frog leaps over the lazy fox.  
The quick yellow dog leaps over the lazy fox.  

您希望匹配与青蛙不匹配的行。这是awk脚本。请注意,我们将sed正则表达式(regex)放在字符串cmd中,将其替换为所需的任何sed正则表达式(注意:您确实需要close(cmd)):


将以上内容放入脚本“match\u all\u but\u frog.awk”。然后:

awk -f match_all_but_frog.awk <input_file


如果您想匹配“青蛙”、“青蛙”或“青蛙”以及“青蛙”:

BEGIN {
IGNORECASE = 1;
      }
!/frog|frogs/  {cmd="echo " $0 "|sed 's/leaps/jumps/'" ;cmd|getline output;print output;close(cmd)}

我建议使用awk

您的数据保存在“输入文件”中:

The quick brown fox leaps over the lazy dog.  
The swift brown fox leaps over the lazy dog.  
The swift green frog leaps over the lazy fox.  
The quick yellow dog leaps over the lazy fox.  

您希望匹配与青蛙不匹配的行。这是awk脚本。请注意,我们将sed正则表达式(regex)放在字符串cmd中,将其替换为所需的任何sed正则表达式(注意:您确实需要close(cmd)):


将以上内容放入脚本“match\u all\u but\u frog.awk”。然后:

awk -f match_all_but_frog.awk <input_file


如果您想匹配“青蛙”、“青蛙”或“青蛙”以及“青蛙”:

BEGIN {
IGNORECASE = 1;
      }
!/frog|frogs/  {cmd="echo " $0 "|sed 's/leaps/jumps/'" ;cmd|getline output;print output;close(cmd)}

您可以只使用
grep-Ev“regex模式”//path/to/yout/file
,它将匹配与regex模式不匹配的每一行/path/to/yout/file并且它将匹配与正则表达式模式不匹配的每一行

如果您只想打印与正则表达式不匹配的行,
grep-v
是该作业的正确工具

您可以在sed中对不匹配的行进行简单替换,如下所示:

sed -n '/frog/! s/leaps/jumps/ p' file
-n
表示不打印,
否定匹配,
s
替换,然后
p
打印

对于更复杂的处理,我会使用awk(我在这里展示了与sed示例等效的方法):


如果只想打印与正则表达式不匹配的行,
grep-v
是该作业的正确工具

您可以在sed中对不匹配的行进行简单替换,如下所示:

sed -n '/frog/! s/leaps/jumps/ p' file
-n
表示不打印,
否定匹配,
s
替换,然后
p
打印

对于更复杂的处理,我会使用awk(我在这里展示了与sed示例等效的方法):


你要找的是这样的东西吗

awk '!/green/{$5="jump"; print}' file

The quick brown fox jump over the lazy dog.
The swift brown fox jump over the lazy dog.
The quick yellow dog jump over the lazy fox.

你要找的是这样的东西吗

awk '!/green/{$5="jump"; print}' file

The quick brown fox jump over the lazy dog.
The swift brown fox jump over the lazy dog.
The quick yellow dog jump over the lazy fox.


请注意,-E开关不是必需的。@casimirithippolyte是的,你是对的,键入此命令是一种习惯,因为我经常使用量词,所以每次使用正则表达式时,我通常都键入
grep-E
,即使不需要;)是的,没错。但是,您不能在同一行中进行您想要进行的更改。我之所以发布这篇文章,是因为我在寻找这个问题的解决方案,在这里发现了一个非常复杂的页面:-所以我想我应该提供一个更简单的解决方案。请注意,-E开关不是必需的。@Casimirithippolyte是的,你是对的,键入此命令是一种习惯,因为我经常使用量词,因此每次使用正则表达式时,我通常键入
grep-E
,即使在不必要的时候;)是的,没错。但是,您不能在同一行中进行您想要进行的更改。我之所以发布这篇文章,是因为我一直在寻找这个问题的解决方案,在这里发现了一个非常复杂的页面:-所以我想我应该提供一个更简单的解决方案。为了匹配
frog
以及
frogs
,您不需要使用替换,因为第一个分支(frog)同样匹配青蛙。当你可以用
sub
/
gsub
在awk中进行替换时,使用这种复杂的方法是毫无意义的。要使操作块以不匹配正则表达式为条件,请使用
/regex/
。是的,如果您习惯使用awk,我同意,有很多方法可以做得更好。我试图提供一些可以被不熟悉awk的人使用的东西,这些人在使用sed时遇到困难。我自己也在寻找这个解决方案,在这里找到了一个复杂的页面,这应该更容易:是的,“青蛙”也和“青蛙”匹配。这样做的目的是为了说明,您可以将任意正则表达式放入其中,以使其与许多内容不匹配。。。而不是特别寻找青蛙。谢谢你的建议,@tom fenech,我通过合并它改进了答案。要匹配
青蛙
以及
青蛙
,你不需要使用替换,因为第一个分支(青蛙)也匹配青蛙。使用这种复杂的方法毫无意义,当您可以使用
sub
/
gsub
在awk中进行替换时。要使操作块以不匹配正则表达式为条件,请使用
/regex/
。是的,如果您习惯使用awk,我同意,有很多方法可以做得更好。我试图提供一些可以被不熟悉awk的人使用的东西,这些人在使用sed时遇到困难。我自己也在寻找这个解决方案,在这里找到了一个复杂的页面,这应该更容易:是的,“青蛙”也和“青蛙”匹配。这样做的目的是为了说明,您可以将任意正则表达式放入其中,以使其与许多内容不匹配。。。汤姆·费内克(tom fenech)说,我并没有特别去寻找青蛙。谢谢你的建议,我把答案合并了进去,从而改进了答案。但奇怪的是,它不起作用:它什么也不打印。我刚刚在linux和OS/X上试用过。如果没有打印任何内容。有什么建议吗?奇怪的是,它不起作用:它不打印