대체 명령의 sed 오류 플래그: "n"

대체 명령의 sed 오류 플래그: "n"

이 명령을 실행할 때

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 을 사용한다고 가정하면 zshGNU 시스템에서는 다음과 같습니다.

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" -- |

관련 정보