如何在双引号内部转义双引号?

25 浏览
0 Comments

如何在双引号内部转义双引号?

在Bash中,我如何在双引号字符串中转义双引号?

例如,在我的shell脚本中:

#!/bin/bash
dbload="load data local infile \"'gfpoint.csv'\" into table $dbtable FIELDS TERMINATED BY ',' ENCLOSED BY '\"' LINES TERMINATED BY \"'\n'\" IGNORE 1 LINES"

我无法正确转义带有双引号的ENCLOSED BY '\"'。我不能使用单引号来定义我的变量,因为我想使用变量$dbtable

0
0 Comments

如何在双引号内部转义双引号?

在使用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文件时的问题。

0
0 Comments

在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的回答中所示。

在这个简单的例子中确实如此,但在嵌套引号的复杂情况下,可能需要使用这种转义方法,而上述示例帮助我弄清楚了如何处理这些情况。

0
0 Comments

在双引号内使用反斜杠来转义双引号。例如: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。除非知道你期望匹配的字符串/如何进行测试,否则无法更多地评估你的评论。

0