sed:-e 表达式 #1,字符 37:未终止的“s”命令

sed:-e 表达式 #1,字符 37:未终止的“s”命令

您好,我正在尝试更改文件夹中多个文件的内容。我在尝试迭代存储需要编辑的文件名称的数组时遇到 sed 错误。我尝试使用数组“ ${len_1[0]}”的特定元素,它工作得很好。

这是我到目前为止所做的:

len_1=($(find . -name "*.dita"))
len=${#len_1[@]}
echo $len

for ((i=0; i<=len; i++)); do
    apps=$(grep -Po 'appname="\K[^"]+' ${len_1[$i]}) && 
        title=$(grep -Po '<title>\K[^</title>]+' ${len_1[$i]}) && 
            sed -i "s/_[0-9]\+/_$apps.$title/g" ${len_1[$i]} && 
                sed -i "s/id=\"[0-9]\+\"\+/id=\"$apps.$title\"/g" ${len_1[$i]};
    done

如前所述

apps=$(grep -Po 'appname="\K[^"]+' ${len_1[0]}) && 
    title=$(grep -Po '<title>\K[^</title>]+' ${len_1[0]}) && 
        sed -i "s/_[0-9]\+/_$apps.$title/g" ${len_1[0]} && 
            sed -i "s/id=\"[0-9]\+\"\+/id=\"$apps.$title\"/g" ${len_1[0]};

工作完美。

我得到的错误是:

sed: -e expression #1, char 37: unterminated `s' command
sed: -e expression #1, char 33: unterminated `s' command
sed: -e expression #1, char 36: unterminated `s' command
sed: -e expression #1, char 36: unterminated `s' command
sed: -e expression #1, char 37: unterminated `s' command
sed: -e expression #1, char 39: unterminated `s' command
sed: -e expression #1, char 34: unterminated `s' command

答案1

如果有多个匹配项,grep -o将产生多行输出。和换行符结束sed命令:

$ echo abcabbcd | grep -o 'ab*'
ab
abb

$ repl=$(echo abcabcd | grep -o 'ab*')
$ sed -e "s/foo/$repl/"
sed: -e expression #1, char 8: unterminated `s' command

此外,还[^</title>]+表示“不属于^</tile或中任何一个的一个或多个字符>”。这可能不是您真正想要的:

$ echo '<title>abcdefgh</title>' | grep -Po '<title>\K[^</title>]+'
abcd

当分隔符只有一个字符时,您可以使用等效的方法,例如"[^"]*"可以。但在这里类似的东西<title>\K.*?(?=</title>)'可能会更好:

$ echo '<title>abcdefgh</title> <title>foobar</title>' | grep -Po '<title>\K.*?(?=</title>)'
abcdefgh
foobar

(虽然我会避免使用诸如\K和 前瞻之类的技巧,并使用更简单的perl -lne 'print $1 if m,<title>(.*?)</title>,'或后处理输出,但这是我的偏好。)

相关内容