2

在过去的半个小时里,我一直在为此绞尽脑汁,到目前为止我所尝试的一切都失败了!

在 html 文件中,标签中有一个字段,但该字段本身没有用 > 符号的空格分隔,因此很难用 awk 读取。我基本上想在开始标记后添加一个空格,但是 gsub 和 awk 拒绝合作。

我试过了

awk 'gsub("class\\\'\\\'>","class\\\'\\\'>")' filename

因为需要一个反斜杠来转义单引号,第二个来转义反斜杠本身,第三个来转义序列 \' 但是终端(我在 Mac 上工作)拒绝执行,而是进入下一行等待我的其他意见。

请帮忙 :(

4

2 回答 2

1

在 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 表达式放在一个文件中。然后,使用-fawk 中的标志 - 这个标志将使 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]
于 2012-05-30T18:14:14.390 回答
0

问题是您正在转义',因此您没有完成命令。例如:

echo \' > foo

将单引号回显到名为 foo 的文件中,并且

echo \\\' > foo

写一个反斜杠,后跟一个单引号。

特别是,您不能在字符串中转义单引号,因此

'foo\'bar'

是后跟不匹配开引号foo\的字符串。bar和写的完全一样"foo\\"bar'

于 2012-05-30T18:13:19.317 回答