파일에서 단어를 제거할 수 있는 Perl One liner에 대해 아는 사람이 있습니다. 예를 들어 다음이 있는데 Linux에서는 작동하지 않습니다.
$ ssh root\@$host perl -p -e 's/value1/ /' -e 's/value2/ /' /tmp/file
답변1
표준 출력에 수정된 출력을 표시하는 대신 내용을 변경하려면 파일을 "제자리에서" 편집하는 옵션을 사용해야 /tmp/file
합니다 . 세부정보를 보고 검색하세요 .perl
-i
man 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.bak
Perl에 의해 편집되기 전에 복사됩니다.
를 사용하면 이 작업을 쉽고 약간 더 빠르게 수행할 수 있습니다(루프에서 여러 번 실행하지 않는 한 눈에 띄지 않을 수도 있음). sed
이 역시 동일한 -i
옵션이 있습니다.
에서 man sed
:
-i[접미사], --in-place[=접미사]
파일을 제자리에서 편집(또는 접미사가 제공된 경우 백업)
ssh "root@$host" sed -i -e 's/value1\|value2/ /' /tmp/file
또는 sed의 -E
ERE(확장 정규 표현식) 옵션을 사용하세요.
ssh "root@$host" sed -i -E -e 's/value1|value2/ /' /tmp/file
그런데, perl 에서처럼 를 사용하여 여러 sed 명령을 분리할 수 있습니다 ;
.