如何在 sed 中用特殊字符替换变量字符串

如何在 sed 中用特殊字符替换变量字符串

我开始使用 sed 来替换文件中的文本,以便更容易地批量更改文件的内容,并且我将每个值需要设置为 BASH 的变量,并将替换设置为调用所有变量的函数替换现有文本。例子~

sed -i -e "s/$answer/$FORME $answer/g" ~$answer.txt

$answer 是终端中命令输入的变量。 $FORME 是一个根据 $answer 的输入定义的变量,但是 $FORME 包含“/”,我一直在网上浏览,找不到使用包含特殊字符的变量替换的方法。当我尝试在 $answer 上使用使用特殊字符创建 $FORME 的命令时,会显示以下错误:

sed: -e expression #1, char 15: unknown option to `s'

我假设这意味着 $FORME 中的特殊字符被注册为实际命令的一部分,而不是要替换的字符串。请帮忙!

提前致谢!

答案1

您可以使用任何字符作为s命令分隔符,例如,

sed -i -e "s|$answer|$FORME $answer|g" ~$answer.txt

答案2

令人惊讶的是,这个问题在 Stack Exchange 上都有人提出和回答,但对于这个非常合理的问题,两个普遍有用的答案却是大海捞针。他们是:

1. 仅转义变量中 4 个可能的特殊字符

正如所指出的这里(尽管这个问题是 SE 对一般问题的厌恶的受害者),在 sed 命令的替换部分中只有 4 个字符被认为是特殊的s\&、 换行符和分隔符(通常/但实际上可以是任何东西)。

因此,要在 sed 中使用任意变量作为替换,请首先转义这四个字符的任何出现,如下所示:

REPL='Arbitrary variable potentially with special characters like / and & and \ and 
newline\
newline2'
REPL=$(sed -e 's/[&\\/]/\\&/g; s/$/\\/' -e '$s/\\$//' <<<"$REPL")
hexdump -C <<< "$REPL"

例如:

REPL='/&\ 
newline'
REPL=$(sed -e 's/[&\\/]/\\&/g; s/$/\\/' -e '$s/\\$//' <<<"$REPL")
sed "s/x/$REPL/" <<< "STARTxEND"

产生:

START/&\ 
newlineEND

正如预期的那样。

2. 使用等效工具逐字解释替换变量

perl(参考)具有此功能,因为变量(只要通过导出它们或在调用行中设置它们而成为环境的一部分)是一等公民。\Q替换字符串中不需要注释(但在正则表达式字符串中很有用)。

export REPL='/&\ 
newline'
perl -pe 's/x/$ENV{REPL}/' <<< "STARTxEND"

产生:

START/&\ 
newlineEND

awk, 尽管参考, 才不是。

相关内容