我是正则表达式的新手,遇到了一些挫折。我正在尝试使用表示目录的字符串,并且通过运行以下命令可以重现问题:
echo "a" | sed "s/a/home/books/examples/file/g"
我尝试通过将 sed 命令的替换部分括在 \Q 和 \E 中来转义,如下所示:
echo "a" | sed "s/a/\Qhome/books/examples/file\E/g"
我还尝试在两个命令中传递 -r 标志以启用扩展正则表达式,但我认为这不是问题。
编辑:我认为问题在于 sed 将路径中的一些字符解释为特殊的正则表达式字符,因此我希望转义它们,但无法一一转义它们。我上面描述的转义序列的方法不起作用。
我知道可以转义单个字符,但这对我不起作用,因为其中许多字符串是通过变量访问的,进行此类替换本身需要另一个类似的 sed 命令!
我打算在 shell 脚本中执行此命令。
答案1
在 sed 中,您必须手动为每个字符添加反斜杠,或切换到不同的分隔符。如果字符串是动态的并且来自用户,您永远不知道哪个字符是安全的。你可以玩类似的东西
s=${s//'\'/'\\'}
s=${s//'/'/'\/'}
sed "s/$s/replacement/g"
在 bash 中,但切换到 Perl 更容易。在 Perl 中,您可以使用以下\Q...\E
语法来引用子字符串:
perl -pe 's/\Q$ARGV[1]\E/replacement/g' "$s"