使用 sed 附加包含转义字符的字符串

使用 sed 附加包含转义字符的字符串

目前我使用:

sed -i -e "5a\\
${text}" $filename

将某些内容附加到特定行,其中变量文本包含字符串,例如“\epsilon”。

使用时

echo -E $text

字符串显示得很好,但是当我在传递给的字符串中扩展它时sed,所有转义字符都会扩展,结果不是我想要的。

如何让 sed 使用该字符串的原始内容而不转义任何内容?

答案1

sed 命令a\解释转义符,因此您需要在要插入的字符串中重复反斜杠。尝试这个:

sed -e "5a\\
$(echo -E "$text" | sed -e 's/\\/\\\\/g')"

答案2

引用是很棘手的。我建议使用不需要添加额外引号的工具,例如 awk 或 perl。这两个工具允许您在命令行或通过环境传递参数,并在文本操作中使用它们。使用 Perl:

export text
perl -i -pe '$_ .= "$ENV{text}\n" if $. == 5' "$filename"

使用 awk,您需要手动移动文件:

tmp=$(TMPDIR=$(dirname -- "$filename") mktemp)
awk -v text="$text" '{print} NR==5 {print text}' <"$filename" >"$tmp" &&
mv -- "$tmp" "$filename"

答案3

您通常可以使用转义printf "%q",试试这个:

text='\epsilon'
echo -e "$text"
silon

%q

text=$(printf "%q" '\epsilon')
echo -e "$text"
\epsilon

答案4

由于我不是 sed 高手,我发现用 echo 解释更容易。

使用单引号而不是双引号。

示例1:

echo "one\\two"
one\two

示例2:

echo 'one\two'
one\two

因此,通过使用 example2 方式,您不必转义任何内容。单引号 's\t\r\i\n\g' 内的字符串按原样解释。 (\ 字符不能用作转义字符)

来源:

相关内容