sed用多行变量替换行

时间:2014-09-25 14:25:33

标签: bash sed multiline

我试图用存储在变量中的多行字符串替换文件中的单行。 我可以在打印到屏幕时获得正确的结果,但如果我想在原地进行操作,则无法获得正确的结果。更换。

该文件具有以下形式:

*some code*
*some code*
string_to_replace
*some code*

我希望生成的文件为:

*some code*
*some code*
line number 1
line number 2
line number 3
*some code*

我试过的代码是:

new_string="line number 1\nline number 2\nline number 3"

# Correct output on screen
sed -e s/"string_to_replace"/"${new_string}"/g $file

# Single-line output in file: "line number 1line number 2line number 3"
sed -i s/"string_to_replace"/"${new_string}"/g $file

尝试组合-i和-e选项时,结果与仅使用-i时的结果相同。 有人可以帮我解决这个问题吗?

我在CentOS上使用GNU sed版本4.1.5(通过Mac的ssh连接到它)

3 个答案:

答案 0 :(得分:1)

将多行字符串内联到 sed 脚本中要求您转义任何文字换行符(以及任何文字 & 字符,否则会插入您要替换的字符串,当然还有任何文字反斜杠,以及您用作替换分隔符的任何字符)。究竟什么起作用还略微取决于精确的 sed 方言。最终,这可能是使用除 sed 之外的其他东西更健壮和便携的情况之一。但是尝试例如

sed -e 's/[&%\\]/\\&/g' \
    -e '$!s/$/\\/' \
    -e '1s/^/s%string_to_replace%/' \
     -e '$s/$/%g/' <<<$replacement |
# pass to second sed instance
sed -f - "$file"

<<<"here string" 语法是 Bash 特有的;您可以将其替换为 printf '%s\n' "$replacement" | sed

并非所有 sed 版本都允许您使用 -f - 在标准输入上传递脚本。也许尝试用 /dev/stdin/dev/fd/0 替换单独的破折号;如果这也不起作用,则您必须将生成的脚本保存到临时文件中。 (Bash 允许您使用命令替换 sed -f <(sed ...) "$file",这非常方便,并且无需在完成后删除临时文件。)

演示:https://ideone.com/uMqqcx

答案 1 :(得分:0)

sed中你可以双引号命令字符串并让shell为你做扩展,如下所示:

new_string="line number 1\nline number 2\nline number 3"
sed -i "s/string_to_replace/$new_string/" file

答案 2 :(得分:0)

尽管您特别要求sed,但是可以使用awk通过使用以下

将多行变量存储在文件中来完成此操作
awk '/string_to_replace/{system("cat file_with_multiple_lines");next}1' file_to_replace_in > output_file