使用sed&更改bash中除变量之外的每个符号。正则表达式

时间:2015-08-07 17:14:32

标签: regex bash awk sed escaping

我需要更改字符串

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

这样的字符串

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

因此,除了这两种情况中的变量外,我需要转义EACH符号。

另外,这很棘手,我需要将它们两次转义,以便通过使用命令来实现结果:

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

另外,我已经完成了所有角色的转义:

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

那么,问题是如何不逃避$变量?

我非常擅长正则表达式,所以只需要工作示例即可。但任何解释都是受欢迎的。另外,如果我发现它比你们任何人都快,我会在这里发布答案。我认为这是一个有趣的难题:)

1 个答案:

答案 0 :(得分:2)

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

s='Example \%^ $variable"abc" ${array[$element]} ${var}this'
perl -pe 's/\$(?:{.*?}|\w+)(*SKIP)(*F)|(.)/\\$1/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", $0, RT}' <<< "$s"
\E\x\a\m\p\l\e\ \\\%\^\ $variable\"\a\b\c\"\ ${array[$element]} ${var}\t\h\i\s\