주어진 N에 대해 표준 입력에서 N번째 단어를 제거하는 스크립트를 만들고 싶습니다 . 예를 들어 다음 입력의 경우:
One two three four, five
six seven eight, nine
8번째 단어를 제거하도록 요청하면 제거해야 합니다 eight,
. 제 목적에 따르면 단어는 공백이 아닌 문자의 시퀀스입니다.
One two three four, five
six seven nine
표준 명령줄 유틸리티를 사용하여 이를 수행할 수 있는 영리한 단일 라이너가 있습니까? 현재 이 작업을 수행하기 위한 상당히 긴 스크립트가 있지만 너무 과도한 것 같습니다.
답변1
그리고 perl
:
$ perl -pe 's/\S+/++$c == 8 ? "" : $&/ge' <your-file
One two three four, five
six seven nine
$ perl -pse 's/\S+/--$n ? $& : ""/ge' -- -n=8 <your-file
One two three four, five
six seven nine
또는 약간 최적화하고 s
n번째 단어가 발견되면 교체를 수행하지 않습니다.
perl -pse 's/\S+/--$n ? $& : ""/ge if $n > 0' -- -n=8 <your-file
답변2
awk를 사용하고 모든 입력을 한 번에 메모리로 읽지 마십시오.
$ awk -v t=8 '{p=n; n+=NF} (n>t) && !f++{$(t-p)=""} 1' file
One two three four, five
six seven nine
답변3
GNU 사용sed
$ sed -Ez 's/(([^ \n]*( |\n)){7})[^ ]*/\1/' input_file
One two three four, five
six seven nine
답변4
이 솔루션은 -z
전체 파일을 "한 줄"로 읽는 GNU sed의 기능을 사용합니다.
sed -Ez 's/\S+//8'
또는 단어 뒤의 공백도 제거하십시오.
sed -Ez 's/\S+ *//8'
이 기사를 게시한 Ed Morton에게 감사드립니다.코멘트로다른 답변으로.