이 명령을 실행할 때
for file in $sourceDir
do
sed -i s/$origText/$newText/g $file
done
나에게 다음과 같은 오류가 발생합니다.
bad flag in substitute command: 'n'
답변1
대부분 $origText
, 또는 뒤에 가 $newText
포함되어 있지만 정규식과 대체 항목 사이의 구분 기호로 사용하고 있습니다 . 이를 이스케이프하거나 변수에 표시되지 않는 구분 기호를 사용해야 합니다. 하지만/
n
/
탈출해야 할 다른 문자가 많이 있습니다.
사용하기가 더 쉬울 것이며 perl
(이러한 구현 중 일부는 sed
처음에 비표준 확장을 차용했습니다) 임의의 문자열을 대체하기가 더 쉬워졌습니다.-i
$origText
원래 포함된 파일 만 덮어쓸 수도 있습니다 .
변수를 인용하지 않고 Bourne과 같은 for
루프를 사용하고 있다고 가정하고 shell 을 사용한다고 가정하면 zsh
GNU 시스템에서는 다음과 같습니다.
print -rNC1 -- "$sourceDir"/*(N.) |
xargs -r0 grep -lZFe "$origText" -- |
L="$origText" R="$newText" xargs -r0 perl -pi -e '
s/\Q$ENV{L}\E/$ENV{R}/g' --
다른 POSIX 유사 셸을 사용하는 경우 첫 번째 print
줄( $sourceDir
로 시작하지 않는다고 가정 -
)을 다음으로 바꿀 수 있습니다.
LC_ALL=C find "${sourceDir%/}/" -maxdepth 1 ! -name '.*' -type f -print0 |
또는 처음 두 줄:
LC_ALL=C find "${sourceDir%/}/" -maxdepth 1 ! -name '.*' -type f \
-exec grep -lZFe "$origText" -- |