Bash 中需要转义的字符是否有一个完整的列表?只用 sed 可以检查吗? 特别地,我正在检查 %
是否需要转义。我试着
echo "h%h" | sed 's/%/i/g'
没有转义 %
并且工作良好。这意味着 %
不需要被转义吗?这是一种检查是否需要转义的好方法吗?
更一般地说:在 shell 和 bash 中需要转义的字符是相同的吗?
有两个简单且安全的规则,不仅适用于 sh,也适用于 bash。
这适用于除单引号本身之外的所有字符。要转义单引号,请关闭其前的引号,插入单引号,然后重新打开引号。
'I'\''m a s@fe $tring which ends in newline
'
sed 命令
sed -e "s/'/'\\\\''/g; 1s/^/'/; \$s/\$/'/"
这个 sed
命令包含多个操作,它们之间用分号 ;
分隔,用于处理文本中的单引号,并在文本的首尾添加单引号。下面逐一进行解读:
1.-e:•-e 选项允许在命令中指定多个编辑命令。这些命令将依次应用于输入文本。2."s/'/'\\\\''/g":•s 是 sed 的替换命令。•/'/'\\\\''/g 中的匹配模式:',即单引号。替换内容:'\\\\'',这里用两个反斜线 \\ 来转义单个反斜线 \。 g 标志表示全局替换,在输入文本中所有的匹配都会被替换,而不仅仅是最先出现的那个。•作用:将文本中的每个单引号替换为 '\'',这样单引号就可以在单引号引起来的字符串中安全使用。3.1s/^/'/:•1s 表示只对第一行进行替换操作。•^ 表示文本行的开头。•替换内容:',即单引号。•作用:在第一行的开头添加一个单引号。4.\s 表示对最后一行进行替换操作。\ 是对 的转义,因为 在 sed 中有特殊含义(表示行的结尾)。•// 中间的 \
整个 sed
命令的作用是:
•将文本中的每个单引号替换为 '\''
,以便单引号可以在单引号引起来的字符串中安全使用。•在文本的第一行开头添加一个单引号。•在文本的最后一行结尾添加一个单引号。
这样处理后的文本可以安全地用作 shell 输入,即使其中包含单引号。
这适用于所有字符,除了换行符。对于换行符,请使用单引号或双引号。空字符串仍然需要处理 —— 将其替换为 ""(空字符串)。
\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/$/"/'
这个 sed
命令包含多个编辑操作,用于处理文本,使其每个字符都被转义,并在文本的首尾添加双引号。下面逐一进行解读:
1.s/./\\&/g:•s 是 sed 的替换命令。•./\\&/g 是替换的具体内容:匹配模式:.,表示任意单个字符。替换内容:\\&,这里用两个反斜线 \\ 来转义单个反斜线,& 表示匹配到的字符。 g 标志表示全局替换,在输入文本中所有的匹配都会被替换,而不仅仅是最先出现的那个。•作用:将文本中的每个字符前面都加上一个反斜线,实现字符转义。2.1{s/^/""/ 是具体的操作:^ 表示空行(即行的开头和结尾之间没有内容)。替换内容:"",即两个双引号。•作用:如果第一行是空行,则将其替换为两个双引号。3.1!s/^/"/:•1! 表示对第一行以外的所有行进行操作。•s/^/"/ 是具体的操作:^ 表示行的开头。替换内容:",即一个双引号。•作用:在第一行以外的每一行的开头添加一个双引号。4./"/:•/"/ 是具体的操作:
整个 sed
命令的作用是:
•将文本中的每个字符前面都加上一个反斜线,实现字符转义。•如果第一行是空行,则将其替换为两个双引号。•在第一行以外的每一行的开头添加一个双引号。•在最后一行以外的每一行的结尾添加一个双引号。
这样处理后的文本可以安全地用作 shell 输入,即使其中包含换行符。
•%q
参数 ARGUMENT
以一种可以重新用作 shell 输入的格式打印出来,使用提议的 POSIX $''
语法来转义非打印字符。
示例的测试命令如下图:
•stackoverflow question 15783701•man sed•man printf