如何在双引号内部转义双引号?
如何在双引号内部转义双引号?
在使用echo命令时,可以通过使用字符的ASCII码来避免转义。例如,可以使用\x22来表示双引号的ASCII码,使用\x27来表示单引号的ASCII码。同样,可以使用相同的方法来输出其他字符。
如果想对变量进行赋值,可以使用$'...'的形式来实现转义。例如,a=$'This is \x22text\x22',输出结果为This is "text"。
如果变量已经由其他程序设置,可以使用sed或类似的工具来应用双引号或单引号。例如,如果变量b="Just another text here",可以使用sed 's/text/"'\0'"/' <<<"$b"将text替换为双引号包裹的"text",输出结果为Just another "0" here。如果想要输出Just another "'text'" here,可以使用sed 's/text/\x22\x27\0\x27\x22/' <<<"$b"。
这种方法可以避免使用大量的反斜杠来转义字符,非常方便。
以上方法可以解决在双引号内部转义双引号的问题。这个问题的解决方法非常实用,可以解决添加PS1变量到~/.profile文件时的问题。
在Shell中,如果需要在双引号内嵌套使用双引号,需要进行转义处理。下面给出了一些示例来演示如何转义引号。
示例1:
$ echo 'abc'\''abc' abc'abc $ echo "abc"\""abc" abc"abc
通过先关闭已经打开的引号('
),然后放置转义的引号(\'
),最后再打开另一个引号('
)来完成转义。
示例2:
$ echo 'abc'"'"'abc' abc'abc $ echo "abc"'"'"abc" abc"abc
通过先关闭已经打开的引号('
),然后在另一个引号内放置引号("'"
),最后再打开另一个引号('
)来完成转义。
更多示例可以参考:Escaping single-quotes within single-quoted strings
根据上述示例,我尝试使用sh -c "echo '{"key":"value"}'"
和sh -c "echo '{''"''key''"'':''"''value''"''}'"
来将单词key和value用双引号括起来,但在这两种情况下,我都得到了{key:value}的结果。
对于双引号来说,这种方法似乎过于复杂:echo "abc\"abc"
已经足够产生abc"abc
的结果,正如Peter的回答中所示。
在这个简单的例子中确实如此,但在嵌套引号的复杂情况下,可能需要使用这种转义方法,而上述示例帮助我弄清楚了如何处理这些情况。
在双引号内使用反斜杠来转义双引号。例如:echo "\""
将打印一个双引号字符。
然而,当使用if [ -f "$(which "\""$x"\"")" ]; then echo exists; else echo broken; fi;
时,无法正常工作,输出结果为broken。而... [ -f "$(which $x)" ]; ...
或者 ... [ -f $(which "$x") ]; ...
则可以正常工作。当$x
或者$(which "$x")
的结果包含空格或其他特殊字符时,就会出现问题。一种解决方法是使用变量来保存which
的结果,但是bash是否真的无法转义引号,还是我做错了什么?
我试图在bash语法的一部分中使用以下代码:grep -oh "\"\""$counter"\""\w*"
,其中$counter
是一个变量。但是它不起作用,请问有什么想法吗?
你的方法不起作用。请删除你的答案,因为它可能已经浪费了很多有用的时间。正确的答案已经由你的答案提供,它只在终端调用时起作用,而在bash文件中不起作用。你在发布之前有没有试过这个方法(可能是一个剪贴粘贴的解决方案)?
这种方法在正确使用时完全有效。Luc上面的评论使用方法错误;他们告诉which
搜索一个文件名中包含字面引号的可执行文件,当然这样的文件不存在。这是Luc自己的问题,而不是这个答案的错误。
此外,在POSIX标准中,\w
根本不起作用于grep
,它是一个PCRE扩展,而grep只支持BRE和ERE。除非知道你期望匹配的字符串/如何进行测试,否则无法更多地评估你的评论。