Bash

使用 sed 附加包含轉義字元的字元串

  • August 10, 2012

目前我使用:

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

將某些內容附加到某一行,其中變數 text 包含一個字元串,例如“\epsilon”。

使用時

echo -E $text

字元串顯示得很好,但是當我在傳遞給的字元串中展開它時sed,所有轉義字元都會被展開,結果不是我想要的。

如何讓 sed 使用該字元串的原始內容而不轉義任何內容?

sed 命令a\解釋轉義,因此您需要在插入的字元串中複製反斜杠。嘗試這個:

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

報價很棘手。我建議使用不需要您添加額外引號的工具,例如 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"

引用自:https://unix.stackexchange.com/questions/45206