안녕하세요. 한 폴더에 있는 여러 파일의 내용을 변경하려고 합니다. 편집해야 하는 파일 이름을 저장하는 배열을 반복하는 동안 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>,'