perl one-liner, 선택사항 정리.

sed 문제로 고민하다가, 결국 perl one-liner 를 선택하게 됐다. 단기간에 속성 흡입(?)을 한 터라, 금방 잊어버릴 듯도 하지만..

자세한 설명은 perldoc perlrun 에서 볼 수 있다. perldoc 은 우분투에선 기본 설치가 되어 있지 않은데, apt install perl-doc 으로 가능하다.


간단하게 정리해본다.

One liner 는 이런 형식이다.

perl -pi.bak -e 's/touch/rough/' file

순서대로 설명한다.

-p : 다음과 같은 코드를 Perl 에서 실행한 효과를 내준다.

  while (<>) {
                 ...             # your program goes here
             } continue {
                 print or die "-p destination: $!\n";
             }

펄을 스크립트로 실행한다면 저런 긴(?) 소스파일을 사용해야 하지만, one liner 라면 -p 로 간단히 처리할 수 있다.
간단하게 말해서, 명령의 결과를 출력하라는 의미다.

-i (-i.bak 등으로 활용) : stdout 으로 출력을 보내지 않고, 입력받은 파일에 직접 수정작업을 한다. (sed -i 와 같다.) 다만, -i.bak 등으로 조정하면, 입력 파일은 수정하고, 수정되기 이전 원본은 *.bak 파일로 보존한다. 꼭 bak 만이 아니라 원하는대로 확장자를 주면 된다.

만약 확장자가 아니라 파일명 앞부분을 바꾸고 싶다면 다음 형식을 사용한다.

perl -pi'~*' -e 's/touch/rough/' file

결과로, file 과 ~file 이 생성된다.

-e 또는 -E : 실행할 명령, 위 코드블럭에서 보면 ‘… your program goes here’ 에 들어갈 명령을 넣어준다.
-e 와 -E 는 같은데, -E 를 쓰면 좀 더 확장된 명령을 쓰게 해준다. -E 에 대해선 perldoc feature 로 확인할 수 있다.

…..

위에는 없지만, -p 대신 -n 을 쓰기도 한다. -n 은 -p 와 같지만, print 명령이 빠져있다. 따라서, print 를 원하면 명령 부분에 추가해줘야 한다.


여러 주장이 있는 듯 하지만, sed 를 perl 로 대체하는게 내가 쓰는 면에선 더 나아 보인다. 문법도 거의 동일하기에 따로 신경쓸 일도 없다.
이유는 한가지. PCRE 가 된다는 점, 따라서 좀 더 편하게 regex 를 쓸 수 있다는게 내겐 가장 강력한 동기가 된다.

awk 는 아직 공부해본 적이 없어 전혀 모르지만, perl 로 모든 가려운 곳을 긁어줄 수 있지 않을까.. 하는 막연한 생각도 든다.

Author: 아무도안

안녕하세요. 글 남겨주셔서 고맙습니다.