从不包含Z的行中删除“A B'c'”模式

时间:2016-07-08 04:35:05

标签: bash shell awk sed grep

File1:

Z "A B 'c'" A
D "A B 'c'" B
GH H

期望的输出:

Z "A B 'c'" A
D B
GH H 

如何使用" A B 'c' "Zbash删除模式awk,但仅限于不包含模式sed的行中grep

3 个答案:

答案 0 :(得分:2)

使用sed,但在此之前解决bash的引用限制,以便sed具有正确的目标字符串。首先单引号模式的双引号,然后双引号单引号,并根据需要重复:

sed '/Z/!s/"A B '"'c'"'" //g' File1

答案 1 :(得分:1)

您不能在单引号分隔的脚本中使用单引号。这是一个shell的东西,无论它是awk还是sed或任何其他脚本都适用。有各种解决方法,但最简单和最健壮的是使用代表'的八进制数,即\047,而不是:

$ awk '!/Z/{sub(/"A B \047c\047"/,"")} 1' file
Z "A B 'c'" A
D  B
GH H

请注意,当你删除你感兴趣的字符串时,它会在D和B之间留下2个空格。如果你关心的话,在RE的任何一端加上一个空白来解决这个问题。

答案 2 :(得分:0)

[ answer ][ @ed-morton ]的方式相同但现在我觉得很想发布使用'的十六进制表示的答案的变体,即\x27

awk '!/Z/{sub(/"A B \x27\c\x27"/,"")}1' 38258963

<强>输出

Z "A B 'c'" A
D  B
GH H

注意

这里唯一的区别是你需要转义c,这也是一个十六进制数字因为它与模式中的single quote紧密相关