파일에서 필드를 추출하여 vim의 다른 파일에 저장합니다.

파일에서 필드를 추출하여 vim의 다른 파일에 저장합니다.

다음 형식의 파일이 있습니다.

.

.

.

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 -nPerl에게 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:. 직업 행이 여러 개인 경우 여러 이름과 직업을 인쇄하게 됩니다. 또한 이름에 직업란이 없으면 인쇄되지 않습니다.

관련 정보