sed: -e 式 #1、文字 37: 終了していない 's' コマンド

sed: -e 式 #1、文字 37: 終了していない 's' コマンド

こんにちは。 1つのフォルダ内の複数のファイルの内容を変更しようとしています。編集する必要があるファイル名を格納する配列を繰り返すと、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>]+^、、、、、、または いずれにも属さない1つ以上の文字」を意味することも<ある。これはあなたが本当に欲しいものではないかもしれません:/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>,'

関連情報