我正在尝试在sed追加中使用变量并遇到问题。
以下命令按预期工作:
sed -i "\:#file = /mnt/var/log/hadoop-yarn/containers/application_1495965866386_0001/container_1495965866386_0001_01_000002/stderr:a file = /path/to/other/file" /etc/conf/service.conf
但是如果我用变量替换模式我遇到错误:
$ echo $item
#file = /mnt/var/log/hadoop-yarn/containers/application_1495965866386_0001/container_1495965866386_0001_01_000002/stdout
$ sed -i "\:$item:a file = /path/to/other/file" /etc/conf/service.conf
sed: -e expression #1, char 122: unterminated address regex
编辑更多信息:所以'item'变量正在从数组中填充。该数组是从readarray和grep:
创建的$readarray LINES < <(grep "#file = /mnt/var/" /etc/conf/service.conf)
$item=${LINES[1]}
$echo $item
#file = /mnt/var/log/hadoop-yarn/containers/application_1495965866386_0001/container_1495965866386_0001_01_000002/stdout
但是我发现如果我手动填充“项目”,那么它会起作用:
$item="#file = /mnt/var/log/hadoop-yarn/containers/application_1495965866386_0001/container_1495965866386_0001_01_000002/stdout"
$sed -i "\:$item:a file = /path/to/other/file" /etc/conf/service.conf
$
因此,readarray / grep
似乎发生了一些奇怪的事情答案 0 :(得分:0)
所以这里的问题原来是作为grep的一部分被引入的换行符。 这就是为什么手动填充$ item的原因 - 没有&#39; \ n&#39;
感谢Ed Morton指出我正确的方向。而
echo "$item" | cat -v
没有显示我添加的任何内容&#39; -t&#39; to readarray命令修剪换行符:
$readarray -t LINES < <(grep "#file = /mnt/var/" /etc/conf/service.conf)
之后事情按预期进行。