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

时间:2014-08-14 12:38:42

标签: regex unix awk sed

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

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还是我需要其他工具?

非常感谢任何帮助。

4 个答案:

答案 0 :(得分:4)

使用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.

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

为什么不使用grep?对你的问题使用否定,这就是我所理解的:

  

保持行终止,包含REDEFINES和PIC。

所以grep似乎很容易:

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

希望这有帮助。

答案 3 :(得分:0)

这可能适合你(GNU sed):

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

或者可能更容易:

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

或者如果您愿意:

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