注意:以下问题与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 命令来执行搜索替换?
答案 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只能使用built-in string manipulation functionality执行相关替换:
/
result=${target//$source/$solution}
echo "$result"
替代对于shell内置匹配不合适的较长输入字符串,您也可以考虑使用perl单行,如BashFAQ #21中所述:
sed