在 Bash 中,单引号绝对不接受 escape。假设我写了这个命令:
$ echo '\''
>
Bash 会'
在第二次考虑由关闭打开的字符串'
,生成一个仅包含\
. 那么,下一个'
被认为是一个新字符串的开始,因此 bash 期望在下一行中有更多输入(由 表示>
)。
如果你不知道这个事实,你可能会认为echo
下面命令后面的字符串会打开,但它是关闭的:
$ echo 'will this string contain a single quote like \'
will this string contain a single quote like \
所以,当你写
'gsub("class\\\'\\\'>","class\\\'\\\'> ")'
您正在编写gsub("class\\\
与反斜杠和引号 ( \'
) 连接的字符串;然后是大于信号。在此之后,将","
被解释为包含逗号的字符串,因为表达式开头的单引号之前已关闭。目前,结果是:
gsub("class\\\\'>,
逗号之后是字符串class
,后跟一个反斜杠和一个引号,然后是另一个反斜杠和另一个引号,最后是一个大于符号和一个空格。这是当前字符串:
gsub("class\\\\'>,class\'\'>
这不是有效的 awk 表达式!无论如何,情况会变得更糟:双引号"
将开始一个字符串,其中将包含一个右括号和一个单引号,但这个字符串永远不会关闭!
总结一下,你的问题是,如果你用 Bash 打开一个字符串,无论你在它前面放多少个反斜杠'
,它都会在下一个被强制关闭。'
解决方案:您可以使用一些技巧来打开和关闭字符串,'
但"
它很快就会变得很麻烦。我建议的解决方案是将您的 awk 表达式放在一个文件中。然后,使用-f
awk 中的标志 - 这个标志将使 awk 执行以下文件:
$ cat filename # The file to be changed
class''>
class>
class''>
$ cat mycode.awk # The awk script
gsub("class''>", "class''>[PSEUDOSPACE]")
$ awk -f mycode.awk filename # THE RESULT!
class''>[PSEUDOSPACE]
class''>[PSEUDOSPACE]
如果您不想写文件,请使用所谓的此处文档:
$ awk -f- filename <<EOF
gsub("class''>", "class''>[PSEUDOSPACE]")
EOF
class''>[PSEUDOSPACE]
class''>[PSEUDOSPACE]