使用 sed 和正则表达式更改 bash 中不包括变量的每个符号

Change each symbol excluding variables in bash using sed & regex

我需要像这样更改字符串

Example \%^ $variable ${array[$element]}

变成字符串就好

\E\x\a\m\p\l\e\ \\%\^\ $variable\ ${array[$element]}

因此,在这两种情况下,除了变量之外,我需要转义每个符号。

此外,这很棘手,我需要将它们转义两次,以便使用命令获得结果:

string='Example \%^ $variable ${array[$element]}' echo `echo $string | sed 'MAGIC'

此外,我已经实现了对所有字符的转义:

echo $(echo $string | sed -r -e 's/(.)/\\/g')

所以,问题是如何不转义 $variables?

我非常擅长正则表达式,所以只需一个工作示例就足够了。但欢迎任何解释。另外,如果我能比你们中的任何人都更快找到答案,我会 post 在这里给出答案。我认为这是一个有趣的难题:)

如果你可以使用 perl 那么就可以像这样轻松完成:

s='Example \%^ $variable"abc" ${array[$element]} ${var}this'
perl -pe 's/$(?:{.*?}|\w+)(*SKIP)(*F)|(.)/\/g' <<< "$s"

输出:

\E\x\a\m\p\l\e\ \\%\^\ $variable\"\a\b\c\"\ ${array[$element]}\ ${var}\t\h\i\s

RegEx Demo


更新:这是使用 gnu-awk 完成的方法:

awk -v RS='\$({.*?}|[[:alnum:]_]+)' '{gsub(/./, "\\&"); printf "%s%s", [=12=], RT}' <<< "$s"
\E\x\a\m\p\l\e\ \\%\^\ $variable\"\a\b\c\"\ ${array[$element]} ${var}\t\h\i\s\