前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >使用Bash时,哪些字符需要转义?

使用Bash时,哪些字符需要转义?

作者头像
程序熵
发布2025-01-13 12:40:17
发布2025-01-13 12:40:17
7800
代码可运行
举报
文章被收录于专栏:技术汇技术汇
运行总次数:0
代码可运行

问题

Bash 中需要转义的字符是否有一个完整的列表?只用 sed 可以检查吗? 特别地,我正在检查 % 是否需要转义。我试着

代码语言:javascript
代码运行次数:0
复制
echo "h%h" | sed 's/%/i/g'

没有转义 % 并且工作良好。这意味着 % 不需要被转义吗?这是一种检查是否需要转义的好方法吗?

更一般地说:在 shell 和 bash 中需要转义的字符是相同的吗?


回答

有两个简单且安全的规则,不仅适用于 sh,也适用于 bash。

1. 将整个字符串放在单引号中

这适用于除单引号本身之外的所有字符。要转义单引号,请关闭其前的引号,插入单引号,然后重新打开引号。

代码语言:javascript
代码运行次数:0
复制
'I'\''m a s@fe $tring which ends in newline
'

sed 命令

代码语言:javascript
代码运行次数:0
复制
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 输入,即使其中包含单引号。

2. 用反斜杠转义每个字符

这适用于所有字符,除了换行符。对于换行符,请使用单引号或双引号。空字符串仍然需要处理 —— 将其替换为 ""(空字符串)。

代码语言:javascript
代码运行次数:0
复制
\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 命令

代码语言:javascript
代码运行次数:0
复制
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 输入,即使其中包含换行符。

使用 printf 命令测试

%q 参数 ARGUMENT 以一种可以重新用作 shell 输入的格式打印出来,使用提议的 POSIX $'' 语法来转义非打印字符。

示例的测试命令如下图:


参考

•stackoverflow question 15783701•man sed•man printf

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-01-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序熵 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题
  • 回答
    • 1. 将整个字符串放在单引号中
    • 2. 用反斜杠转义每个字符
    • 使用 printf 命令测试
  • 参考
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档