다음 형식의 파일이 있습니다.
.
.
.
Name:abc
Occupation:def
.
.
Name:xyz
Occupation:ghi
.
.
vim
이름과 직업 필드를 추출하여 다음 형식을 사용하여 다른 파일 out.txt에 저장하고 싶습니다 .
Name:abc
Occupation:def
Name:def
Occupation:ghi
편집: 입력 파일의 직업 필드 위치가 업데이트되었습니다.
답변1
ggyG:e out.txt<cr>p:v/Name\|Occupation/d<cr>:w<cr>
설명하다
gg # Go to beginning of file
y # yank (copy)
G # to end of file
:e out.txt # Open a new file called out.txt
p # paste what you just copied
:v/Name\|Occupation/d # Delete all lines that don't contain Name or Occupation
:w # save
답변2
vim
버퍼와 종료( )를 작성 하고 사용하는 것은 :wq
어떻습니까 ?
grep -E '^(Name|Occupation)' your_file >out.txt
이 명령은 우리가 지정한 패턴과 일치하는 모든 줄을 grep
인쇄합니다 . your_file
여기에 사용된 패턴에는 확장 정규 표현식이 필요하며, 이를 -E
로 전환하는 데 사용합니다 grep
. 패턴은 다음과 같습니다.
^
줄의 시작을 나타냅니다.(Name|Occupation)
검색을 의미Name
하거나Occupation
- 요약하자면, 정규식은 단어로 시작하는 줄
Name
이나 단어로 시작하는 줄을 찾는 것을 의미합니다Occupation
.
그대로 두면 이 grep
명령은 일치하는 모든 줄을 터미널에 인쇄합니다. 마지막 자리 ( >out.txt
)리디렉션명령의 출력은 터미널 대신 grep
파일로 이동됩니다 .out.txt
답변3
윔:
:g/\./d | sav /tmp/otherFileName
사회경제개발국:
sed '/\(\.\)/d' InputFile >> /tmp/otherFileName
완벽한:
:v/^Name*\|^Occupation*/d | s/^Name/\r&/g | sav /tmp/OtherFileName
답변4
밖에서 vim
, 그 중에서할 수 있다결과를 얻기 위해 동일한 결과를 얻을 수 있는 명령줄 도구가 많이 있습니다. Perl을 예로 들어보겠습니다.
perl -n -e '$name=$1 if(/^(Name: .+)$/); print "$name\n\n$_\n" if(/^Occupation: .+/);' < file > out.txt
perl -n
Perl에게 STDIN
표준 입력( )의 각 행을 while 루프로 래핑하도록 지시합니다. perl 명령 끝에 사용 STDIN
하면 파일을 다음으로 리디렉션할 수 있습니다 .< file
이는 우리가 리디렉션하는 각 줄에서 perl 명령을 실행할 수 있게 하는 효과가 있습니다 file
.
-e
그런 다음 Perl이 이 옵션을 사용하여 실행해야 하는 명령을 다음과 같이 지정합니다 .
'$name=$1 if(/^(Name: .+)$/); print "$name\n\n$_\n" if(/^Occupation: .+/);'
'
( perl 명령줄에서 -e 옵션이 단일 인수로 필요하기 때문에 perl 지시문 주위에 작은따옴표가 있음을 참고하십시오 .)
코드의 논리를 살펴보면,
$name=$1 if(/^(Name: .+)$/);
줄이 ^
로 시작하고 Name:
그 뒤에 하나 이상의 문자가 .+
오고 줄의 끝이 오면 $
, 이를 래핑하면 모든 일치 항목을 저장할 수 있으며 ()
이라는 특수 변수에서 사용할 수 있습니다 $1
. 그래서 모든 것이 Name: whatever
에 저장됩니다 $1
. 그런 다음 이를 이라는 변수에 할당합니다 $name
.
이전 지침과 유사하게 다음에 수행할 작업은 다음과 같습니다.
print "$name\n\n$_\n" if(/^Occupation: .+/);'
줄이 ^
로 시작하고 그 Occupation:
뒤에 하나 이상의 문자 가 오고 .+
줄이 끝나면 $
이전에 일치하는 이름 줄($name에 저장됨), 두 개의 개행 문자 \n\n
, 그리고 $_
while에 의해 처리되고 있는 현재 줄의 내용을 인쇄합니다. 루프(우리의 경우 Occupation 라인과 일치함) 다음에 또 다른 개행 문자가 옵니다 \n
.
마지막으로 이 명령의 출력을 out.txt 로 리디렉션합니다 > out.txt
.
Name:
다음 각 줄(다음 몇 줄)에는 해당 직업과 관련된 직업이 있다고 가정합니다 Name:
. 직업 행이 여러 개인 경우 여러 이름과 직업을 인쇄하게 됩니다. 또한 이름에 직업란이 없으면 인쇄되지 않습니다.