在过去的半个小时里,我一直在绞尽脑汁,到目前为止,我所尝试的一切都失败了!
在html文件中,标签内有一个字段,但是字段本身没有用空格和>号分隔,所以很难用awk读取。我基本上想在开始标签后添加一个空格,但是gsub和awk拒绝合作。
我试过了
awk 'gsub("class\\\'\\\'>","class\\\'\\\'>")' filename因为需要一个反斜杠来转义单引号,第二个反斜杠来转义反斜杠本身,第三个反斜杠来转义序列\‘,但是Terminal (我在Mac上工作)拒绝执行,而是进入下一行,等待我的其他输入。
请帮助我:(
发布于 2012-05-31 02:14:14
在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中用'打开一个字符串,它将在下一个'处强制关闭,无论你在它前面放了多少反斜杠。
Solution:您可以使用'和"来做一些打开和关闭字符串的技巧,但它很快就会变得很麻烦。我建议的解决方案是将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]发布于 2012-05-31 02:13:19
问题是您正在转义',所以您没有完成命令。例如:
echo \' > foo将单引号回显到名为foo的文件中,并且
echo \\\' > foo写一个反斜杠,后跟一个单引号。
特别是,您不能转义字符串中的单引号,因此
'foo\'bar'是字符串foo\,后跟字符串bar,后跟一个不匹配的左引号。它与编写"foo\\"bar'完全相同
https://stackoverflow.com/questions/10821622
复制相似问题