在 Bash 中是否有任何需要转义的完整字符列表?可以只用 sed
来检查吗?
特别是,我正在检查 %
是否需要转义。我试过了
echo "h%h" | sed 's/%/i/g'
并且工作正常,没有转义 %
。这是否意味着 %
不需要转义?这是检查必要性的好方法吗?
更一般的:它们是在 shell
和 bash
中转义的相同字符吗?
最佳答案
有两个简单而安全的规则,不仅适用于 sh
,而且适用于 bash
。
1。将整个字符串放在单引号中
这适用于除单引号本身之外的所有字符。要转义单引号,关闭它之前的引号,插入单引号,然后重新打开引号。
'I'\''m a s@fe $tring which ends in newline
'
sed 命令:sed -e "s/'/'\\\\''/g; 1s/^/'/;\$s/\$/'/"
2。用反斜杠转义每个字符
这适用于除换行符之外的所有字符。对于换行符,使用单引号或双引号。 仍然必须处理空字符串 - 替换为 ""
\I\'\m\ \a\ \s\@\f\e\ \$\t\r\i\n\g\ \w\h\i\c\h\ \e\n\d\s\ \i\n\ \n\e\w\l\i\n\e"
"
sed 命令:sed -e 's/./\\&/g; 1{$s/^$/""/}; 1!s/^/"/; $!s/$/"/'
.
2b。更具可读性的版本 2
有一组简单安全的字符,如 [a-zA-Z0-9,._+:@%/-]
,可以不转义以使其更具可读性
I\'m\ a\ s@fe\ \$tring\ which\ ends\ in\ newline"
"
sed 命令:LC_ALL=C sed -e 's/[^a-zA-Z0-9,._+@%/-]/\\&/g; 1{$s/^$/""/}; 1!s/^/"/; $!s/$/"/'
.
请注意,在 sed 程序中,无法知道输入的最后一行是否以换行字节结尾(除非它为空)。这就是为什么上面的两个 sed 命令都假定它没有。您可以手动添加带引号的换行符。
请注意,shell 变量仅为 POSIX 意义上的文本定义。未定义处理二进制数据。对于重要的实现,二进制工作,但 NUL 字节除外(因为变量是用 C 字符串实现的,并且意味着用作 C 字符串,即程序参数),但是您应该切换到“二进制”语言环境,例如 latin1 .
(您可以通过阅读 sh
的 POSIX 规范轻松验证规则。对于 bash,请查看@AustinPhillips 链接的 reference manual)
关于bash - 使用 Bash 时需要转义哪些字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15783701/