一个内线awk html标签替换“''>”与gsub一起使用“''>”

时间:2012-05-30 17:52:55

标签: html awk escaping gsub

在过去的半个小时里,我一直用这种方式绞尽脑汁,到目前为止我所尝试的一切都惨遭失败!

在html文件中,标签内有一个字段,但字段本身没有用>中的空格分隔。签名所以很难用awk阅读。我基本上想在开始标记之后添加一个空格,但gsub和awk拒绝合作。

我试过

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

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

请帮助:(

2 个答案:

答案 0 :(得分:1)

在Bash中,单引号接受绝对没有任何逃避。假设例如我写这个命令:

$ 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表达式放在一个文件中。然后,使用awk中的-f标志 - 这个标志将使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]

如果您不想编写文件,请使用所谓的here documents

$ awk -f- filename <<EOF 
gsub("class''>", "class''>[PSEUDOSPACE]")
EOF
class''>[PSEUDOSPACE]
class''>[PSEUDOSPACE]

答案 1 :(得分:0)

问题是你正在逃离',所以你没有完成命令。例如:

echo \' > foo

将单引号回显到名为foo和

的文件中
echo \\\' > foo

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

特别是,你无法在字符串中转义单引号,所以

'foo\'bar'

是字符串foo\,后跟字符串bar,后跟不匹配的打开引号。它与编写"foo\\"bar'

完全相同