在html文件中,标签内有一个字段,但字段本身没有用>中的空格分隔。签名所以很难用awk阅读。我基本上想在开始标记之后添加一个空格,但gsub和awk拒绝合作。
我试过
awk 'gsub("class\\\'\\\'>","class\\\'\\\'>")' filename
因为需要一个反斜杠来逃避单引号,第二个是逃避反斜杠本身,第三个是逃避序列\'但终端(我在Mac上工作)拒绝执行,而是进入下一行等待我的其他一些意见。
请帮助:(
答案 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'