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>]+" ^, <, /, t, i, l또는 e어느 것에도 속하지 않는 하나 이상의 문자 >"를 의미하기도 한다. 이것은 당신이 정말로 원하는 것이 아닐 수도 있습니다:

$ 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>,'

관련 정보