目前我使用:
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' 内的字符串按原样解释。 (\ 字符不能用作转义字符)
来源:一