표준 입력에서 n번째 단어를 제거하는 방법은 무엇입니까?

표준 입력에서 n번째 단어를 제거하는 방법은 무엇입니까?

주어진 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

또는 약간 최적화하고 sn번째 단어가 발견되면 교체를 수행하지 않습니다.

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에게 감사드립니다.코멘트로다른 답변으로.

관련 정보