通过sed

时间:2017-10-24 15:31:42

标签: bash variables sed replace multiline

注意:以下问题与this post有关,但问题的焦点和输入变量的格式都不同(即多行文件的内容)。因此,正确的解决方案也可能不同。

只要所述变量包含显式换行符(sed),就会通过\n替换带有多行变量的字符串中的关键字。

$ target="foo \n bar \n baz"
$ echo "qux\nquux" > file
$ solution=$(cat file)
$ echo "$solution"
qux\nquux
$ echo $target | sed -e "s|bar|$solution|"
foo \n qux
quux \n baz

但是,当我在文本编辑器中打开文件file并用换行符替换换行符时, sed 的替换失败。

# Newline character was manually replaced with linebreak in texteditor.
$ solution=$(cat file)
$ echo "$solution"
qux
quux
$ echo $target | sed -e "s|bar|$solution|"
sed: -e expression #1, char 9: unterminated `s' command

如果输入变量没有显式换行符,我如何更改 sed 命令来执行搜索替换?

1 个答案:

答案 0 :(得分:2)

简介/设置

sed不一定是这项工作的合适工具。请考虑以下选项 - 每个选项的样本都需要以下设置:

# Run this before testing any of the code below
source='bar'
target='This string contains a target: <bar>'
solution='This has
multiple lines
and /slashes/ in the text'

...并且每个将发出以下输出:

This string contains a target: <This has
multiple lines
and /slashes/ in the text>

请注意,对于sed,您需要选择一个不用于表达式的分隔符(因此,使用s/foo/bar/foo和{{1} }可以包含bar);以下答案都避免了这种限制。

Shell-Builtin参数扩展

shell只能使用built-in string manipulation functionality执行相关替换:

/

Perl One-Liners作为result=${target//$source/$solution} echo "$result" 替代

对于shell内置匹配不合适的较长输入字符串,您也可以考虑使用perl单行,如BashFAQ #21中所述:

sed