首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一行awk html标记将"''>“替换为"''>”,替换为gsub

问一行awk html标记将"''>“替换为"''>”,替换为gsub
EN

Stack Overflow用户
提问于 2012-05-31 01:52:55
回答 2查看 960关注 0票数 2

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

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

我试过了

代码语言:javascript
复制
awk 'gsub("class\\\'\\\'>","class\\\'\\\'>")' filename

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

请帮助我:(

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-31 02:14:14

在Bash中,单引号绝对不接受转义。假设我写了这样的命令:

代码语言:javascript
复制
$ echo '\''
>

Bash将考虑在第二个'关闭时由'打开的字符串,生成一个仅包含\的字符串。因此,下一个'被认为是一个新字符串的开始,因此bash期望在下一行中有更多的输入(由>表示)。

如果您没有意识到这一点,您可能会认为下面的echo命令后面的字符串还会打开,但它是关闭的:

代码语言:javascript
复制
$ echo 'will this string contain a single quote like \'
will this string contain a single quote like \

所以,当你写下

代码语言:javascript
复制
'gsub("class\\\'\\\'>","class\\\'\\\'> ")' 

您正在编写由反斜杠和引号(\')连接的字符串gsub("class\\\;然后是大于号。在此之后,","被解释为包含逗号的字符串,因为表达式开头的单引号之前已结束。现在,结果是:

代码语言:javascript
复制
gsub("class\\\\'>,

逗号后面是字符串class,后面跟着一个反斜杠和引号,然后是另一个反斜杠和另一个引号,最后是一个大于号和一个空格。这是当前字符串:

代码语言:javascript
复制
gsub("class\\\\'>,class\'\'> 

这不是有效的awk表达式!无论如何,更糟的是:双引号"将开始一个字符串,该字符串将包含一个右括号和一个单引号,但这个字符串从来没有结束过!

总结,你的问题是,如果你在Bash中用'打开一个字符串,它将在下一个'处强制关闭,无论你在它前面放了多少反斜杠。

Solution:您可以使用'和"来做一些打开和关闭字符串的技巧,但它很快就会变得很麻烦。我建议的解决方案是将awk表达式放在一个文件中。然后,使用awk中的-f标志-此标志将使awk执行以下文件:

代码语言:javascript
复制
$ 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

代码语言:javascript
复制
$ awk -f- filename <<EOF 
gsub("class''>", "class''>[PSEUDOSPACE]")
EOF
class''>[PSEUDOSPACE]
class''>[PSEUDOSPACE]
票数 1
EN

Stack Overflow用户

发布于 2012-05-31 02:13:19

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

代码语言:javascript
复制
echo \' > foo

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

代码语言:javascript
复制
echo \\\' > foo

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

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

代码语言:javascript
复制
'foo\'bar'

是字符串foo\,后跟字符串bar,后跟一个不匹配的左引号。它与编写"foo\\"bar'完全相同

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10821622

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档