繁体   English   中英

从Unix文件中删除与模式匹配的行

[英]Deleting lines matching a pattern from a Unix file

我有一个文件,包含以下格式的字符串:

05|KEEP|REDEFINES|NO_TYPE|PIC|9.

05|DELETE|REDEFINES|VARIABLE.

05|KEEP2|REDEFINES|VARIABLE2
|PIC|9(5).

我希望能够使用sed或awk之类的东西来删除包含单词REDEFINES的行,但如果单词PIC也在其中或行尾没有句号,则不能删除行,因为这意味着字符串已被分割超过2行。 因此,在上述4行(3个字符串)中,我只想删除05 | DELETE | REDEFINES | VARIABLE。

我以为您也许可以使用某种否定或超前功能,但这些功能似乎不可用,或者我无法使它们正常工作

使用awk会删除上面示例中遵循该模式的字符串中包含REDEFINES的所有内容:

awk '!/[[:print:]]*\REDEFINES[[:print:]]*\./' 

同样使用sed:

sed '/[[:print:]]*|REDEFINES[[:print:]]*\./d'

我只是想不出如何扩展它来做我需要的事情。 在sed或awk中可能吗,还是我需要其他工具?

任何帮助,不胜感激。

使用awk

awk -v RS= '!/REDEFINES/ || /PIC/' file
05|KEEP|REDEFINES|NO_TYPE|PIC|9.
05|KEEP2|REDEFINES|VARIABLE2
|PIC|9(5).

使用sed (使用较旧的输入数据):

sed -i.bak '/REDEFINES/{/PIC/!d;}' file
05|KEEP|REDEFINES|NO_TYPE|PIC|9.

您可以尝试以下命令。 如果该行包含PIC或不包含REDEFINES,请打印该行。 它是可维护的,因为它不是那么棘手,并且无需费力即可理解。

cat input.txt | awk '{if ($0 ~ /PIC/ || $0 !~ /REDEFINES/){print $0}}'

您为什么不只使用grep 通过对您的问题的否定,这是我的理解:

使行以包含REDEFINES和PIC的句号结尾。

所以grep看起来很简单:

$ grep -E 'REDEFINES.*\.$' file | grep PIC
05|KEEP|REDEFINES|NO_TYPE|PIC|9.

希望这可以帮助。

这可能对您有用(GNU sed):

sed -r '/REDEFINES/{/PIC|[^.]$/!d}' file

或更容易:

sed '/PIC/b;/REDEFINES.*\.$/d' file

或者,如果您喜欢:

sed '/PIC/!{/REDEFINES.*\.$/d}' file

暂无
暂无

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

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