“未终止的地址正则表达式”使用sed中的变量

时间:2017-05-29 15:25:54

标签: bash sed

我正在尝试在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

似乎发生了一些奇怪的事情

1 个答案:

答案 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)

之后事情按预期进行。