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' "
,Z
,bash
删除模式awk
,但仅限于不包含模式sed
的行中grep
?
答案 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
紧密相关