如何在 sed 中对字符序列进行空格?

如何在 sed 中对字符序列进行空格?

我是正则表达式的新手,遇到了一些挫折。我正在尝试使用表示目录的字符串,并且通过运行以下命令可以重现问题:

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"

相关内容