[英]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.