vi/vim, 모든 줄의 n번째 단어를 새 파일에 쓰는 방법

vi/vim, 모든 줄의 n번째 단어를 새 파일에 쓰는 방법

새 파일에 모든 줄의 n번째 단어를 쓰는 방법은 무엇입니까? 예를 들어, new_file.txt의 모든 줄 중 두 번째 단어를 쓰고 싶습니다.

이전 파일.txt:

pippo pluto paperino 
gigi lui marco 
piero andrea chiara

새 파일.txt:

pluto  
lui   
andrea

답변1

첫 번째 단계는 각 줄의 두 번째 단어를 제외한 모든 단어를 삭제하는 것입니다. 이것은 매우 간단한 :%norm명령입니다.

:%norm dwwhD

dwwhD각 줄을 수동으로 입력하는 것과 비슷하지만 더 빠릅니다. 두 번째 단계, 새 파일에 저장:

:w new_file.txt

old_file.txt그런 다음 아무것도 변경되지 않도록 저장하지 않고 종료합니다 .

:q!

답변2

:!cut % '-d ' -f2 > new_file.txt

기본 구분 기호는 cut탭이므로 구분 기호를 공백으로 설정하려면 "-d"를 사용해야 합니다.

%Vi 내부에서는 현재 파일 이름을 대체 하여 사용할 수 있습니다 .

답변3

간단한 bash 스크립트를 사용하여 터미널 명령줄에서 이 작업을 수행할 수 있습니다. 첫 번째파일 내용 반복. 그런 다음 각 라인에 대해 에코를 awk로 파이프하고awk가 두 번째 열을 추출하도록 하세요.. 마지막으로 텍스트를 새 파일로 리디렉션합니다.

이 모든 것을 종합하면 다음과 같습니다.

while read line; do
    echo $line | awk '{print $2}' >> new_file.txt
done <old_file.txt

답변4

:s정규식과 함께 명령을 사용하십시오 .

:%s/\v^\s*\S+(\s+(\S+).*)?/\2

이것\vVim에게 grep이나 pcre의 확장 정규식과 유사한 "매우 마법 같은" 정규식 스타일을 사용하라고 지시합니다.

정규식은 시작 부분에 있는 단일 단어와 일치하며 앞에는 일부 선택적인 공백이 있을 수 있습니다. 그런 다음 공백 뒤에 두 번째 단어가 그룹 내부에 캡처됩니다 \2. 마지막으로 a는 .*줄의 나머지 부분 전체와 일치합니다.

첫 번째 단어 뒤의 부분은 선택 사항입니다(대괄호로 그룹화되고 마지막 와 함께 선택 사항임 ?). 이렇게 하면 단일 단어가 있는 줄이 여전히 일치하며, 이 경우 빈 줄로 대체됩니다. 이는 두 번째 단어가 해당 줄의 경우에 작동하므로 단일 단어가 있는 줄에 대해 예상되는 것입니다. 이는 이 작업에 정규식을 사용하는 이점 중 하나입니다. 엣지 케이스가 있는 줄을 처리하는 방법을 더 잘 제어할 수 있기 때문입니다.

마지막으로 \2그룹으로 대체하십시오. 줄의 두 번째 단어만 캡처합니다.

그런 다음 수정 사항을 새 파일 이름으로 저장할 수 있습니다.

:saveas new_file.txt

이렇게 하면 수정되지 않은 상태가 유지되고 old_file.txt현재 버퍼에 대한 추가 수정 사항은 new_file.txt.

관련 정보