Perl 1 라이너 오류 - 작동하지 않음 - 여러 문자열 제거

Perl 1 라이너 오류 - 작동하지 않음 - 여러 문자열 제거

파일에서 단어를 제거할 수 있는 Perl One liner에 대해 아는 사람이 있습니다. 예를 들어 다음이 있는데 Linux에서는 작동하지 않습니다.

$ ssh root\@$host perl -p -e 's/value1/ /' -e 's/value2/ /' /tmp/file

답변1

표준 출력에 수정된 출력을 표시하는 대신 내용을 변경하려면 파일을 "제자리에서" 편집하는 옵션을 사용해야 /tmp/file합니다 . 세부정보를 보고 검색하세요 .perl-iman perlrun-i

또한 변수를 사용할 때는 참조 변수를 사용하세요(예 $host: ).

그런데, 두 개의 서로 다른 패턴을 동일한 값(공백)으로 변경하고 있습니다. 두 가지 별도의 작업이 필요하지 않습니다 s///.

ssh "root@$host" perl -p -i -e 's/value1|value2/ /' /tmp/file

실제로 두 가지 다른 작업이 필요한 경우에도 ;세미콜론( )으로 구분할 수 있습니다.

ssh "root@$host" perl -p -i -e 's/value1/foo/;s/value2/bar/' /tmp/file

원본 파일의 백업 복사본을 만들려면 -i선택적 접미사를 사용하세요. 예를 들어

ssh "root@$host" perl -p -i.bak -e 's/value1|value2/ /' /tmp/file

/tmp/file/tmp/file.bakPerl에 의해 편집되기 전에 복사됩니다.


를 사용하면 이 작업을 쉽고 약간 더 빠르게 수행할 수 있습니다(루프에서 여러 번 실행하지 않는 한 눈에 띄지 않을 수도 있음). sed이 역시 동일한 -i옵션이 있습니다.

에서 man sed:

-i[접미사], --in-place[=접미사]

파일을 제자리에서 편집(또는 접미사가 제공된 경우 백업)

ssh "root@$host" sed -i -e 's/value1\|value2/ /' /tmp/file

또는 sed의 -EERE(확장 정규 표현식) 옵션을 사용하세요.

ssh "root@$host" sed -i -E -e 's/value1|value2/ /' /tmp/file

그런데, perl 에서처럼 를 사용하여 여러 sed 명령을 분리할 수 있습니다 ;.

관련 정보