Bash 스크립트에서 Perl을 사용하여 줄 삭제

Bash 스크립트에서 Perl을 사용하여 줄 삭제

이 명령은 다음과 같습니다.

sed -i "\|^pref\.fullscreen\.toolbarPixels|d" ~/.vmware/preferences

일하다.
하지만 이 명령은:

perl -pi -e "\|^pref\.fullscreen\.toolbarPixels|d" ~/.vmware/preferences

나에게 출력을 제공합니다 :

Backslash found where operator expected at -e line 1, near "pref\"
Backslash found where operator expected at -e line 1, near "fullscreen\"
syntax error at -e line 1, near "\|"
Execution of -e aborted due to compilation errors.

왜?

고쳐 쓰다:

test.txt 파일에는 다음이 포함됩니다.

melon
banana
peach
apple

이 명령은 다음과 같습니다.

perl -ni -e "print unless m|apple|; print unless m|banana|" test.txt

반품:

melon
melon
banana
peach
peach
apple

바꾸다:

melon
peach

왜?

답변1

사과/바나나 문제의 경우 두 명령문 모두 파일의 행에서 작동하므로 중복이 발생합니다. 명령문 필터가 없거나 중복 melon됩니다 peach.

다음 접근 방식을 사용하면 중복을 방지하고 원하는 삭제를 달성할 수 있습니다.

$ perl -ni -e "print unless m/(apple|banana)/" test.txt

정규식에서 가변성을 이동하는 또 다른 방법은 다음과 같습니다.

$ perl -ni -e "print unless m/apple/ or m/banana/" test.txt

답변2

Perl은 sed를 직접 대체하지는 않습니다. 비슷한 구문을 지원 s/pattern/replacement/하지만 이것이 다른 sed 명령이 작동한다는 의미는 아닙니다.

당신은 이것을 할 수 있습니다

perl -ni -e "print unless m|^pref\.fullscreen\.toolbarPixels|"

제 생각에는 아니면 그냥

perl -ni -e "print unless /^pref\.fullscreen\.toolbarPixels/"

비표준 정규식 구분 기호를 사용할 특별한 이유가 없는 것 같기 때문입니다.

관련 정보