업데이트 #2: 옵션에 대해 큰 오해가 있었습니다 -p
. 이제 이 옵션이 인수로 제공된 모든 파일을 처리하는 데 사용된다는 것이 분명해졌지만 stdin
.
업데이트 #1: 기본 구분 기호(개행 문자)를 사용하고 입력 파일이 한 줄인 경우에도 이 옵션이 항상 필요하다는 것을 알았습니다 -p
(적어도 대체를 수행할 때). 왜 삭제하는지 잘 모르겠습니다. -p
단일 라인을 처리하는 옵션(적절한 것으로 보임)은 모든 것을 중단시킵니다(즉, 출력 없음).
예를 들어 예상대로 echo -n 'test' | perl -pe 's/test/newstring/'
출력을 실행 newstring
하지만 echo -n 'test' | perl -e 's/test/newstring/'
아무것도 출력하지 않습니다.
원래 질문:
stdin
Perl 명령(예: ) 에서 읽는 전체 파일을 후루룩 소리 내는 경우 실제로 파일(예: )을 처리하기 위해 perl -0777 -e [...]
여전히 옵션이 제공되어야 하는 이유는 무엇입니까 ?-p
perl -0777 -pe [...]
-p
옵션이 명령의 각 줄 주위에 루프를 배치한다는 것을 이해 하지만 Perl이 파일을 처리할 수 있을 만큼 구분 기호를 변경(이 경우 제거)하지 않는 이유는 무엇입니까? 또는 파일이 한 번만 처리된다는 사실에도 불구하고 명령의 각 행 주위에 루프를 배치하도록 Perl에 지시하는 것이 왜 필요한가요?
답변1
명령 perl --help
에는 -p assumes a loop like -n but prints line also, like sed
. sed
스트림 편집기이며 -p
옵션이 에서 작동하는 방식과 유사하게 텍스트를 조작하는 데 사용됩니다 perl
. 처리된 출력을 인쇄하기 -p
위한 유일한 옵션입니다 . 옵션이 perl
없으면 -p
처리된 출력물을 인쇄할 수 없습니다. 따라서 아래 예에서 볼 수 있듯이 인쇄가 발생하지 않으면 문자열이 대체되지 않습니다.
-p
경고: 파일 을 -n
비워 버리므로 를 로 바꾸지 마십시오 !
~$ sudo grep "CMDLINE_LINUX_DEFAULT" /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="nosplash"
~$ sudo perl -pi -e 's/nosplash/splash/' /etc/default/grub
~$ sudo grep "CMDLINE_LINUX_DEFAULT" /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="splash"
~$ sudo perl -i -e 's/splash/nosplash/' /etc/default/grub
~$ sudo grep "CMDLINE_LINUX_DEFAULT" /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="splash"