모든 줄의 처음 네 문자를 같은 줄의 끝으로 복사하는 방법은 무엇입니까?


10

다음과 비슷한 일련의 줄이 있습니다.

2001 "Some Kind of Title," Author's Name, Publication Name, 1 Mar.
2002 "Some Kind of Title," Author's Name, Publication Name, 12 Oct.
2003 "Some Kind of Title," Author's Name, Publication Name, 8 Apr.
2004 "Some Kind of Title," Author's Name, Publication Name, 3 Jun.

처음 네 문자 (연도)를 가져 와서 줄 끝에 복사하여 다음과 같이 표시 할 수있는 방법이 있습니까?

2001 "Some Kind of Title," Author's Name, Publication Name, 1 Mar. 2001
2002 "Some Kind of Title," Author's Name, Publication Name, 12 Oct. 2002
2003 "Some Kind of Title," Author's Name, Publication Name, 8 Apr. 2003
2004 "Some Kind of Title," Author's Name, Publication Name, 3 Jun. 2004

7
물론 있습니다 : :%g/^\d\{4}\d\@!/s/^\(\d\{4}\).*\zs/ \1/.
사토 카츠라

답변:


17
:% s/\v^(\d{4})(.*)$/\1\2 \1/ 

그것을하는 한가지 방법이다

  • \v 매직 옵션, 그룹화를 피하기 위해 ()
  • ^ 줄의 시작
  • \d{4} 정확히 네 자리 숫자와 일치
  • .* 나머지 줄
  • \1 \2 안에 일치하는 패턴이 있습니다 ()

편집 : @Jair Lopez는 주석에서 언급하면 ​​정규 표현식을 더욱 향상시킬 수 있습니다.

:% s/\v^(\d{4}).*/& \1/ 

또는 동등한

:% s/\v^(\d{4}).*/\0 \1/ 
  • &그리고 \0전체 일치 패턴을 포함

자세한 내용은 vimregexregex FAQ를 참조하십시오.


3
:%s/\v^(\d{4}).*/& \1/더 짧은 명령입니다.
Jair López

10

그리고 매크로가있는 솔루션 :

qqyiwA <Esc>pj0q

다음을 의미합니다.

qq   Record the macro in the register q
yiw  Yank the text described by the text object iw (inner word): The date
A <Esc>   Append a white space to the end of the line and go back to insert mode
p    Paste the date
j0   Place your cursor on the first column of the next line (to be able to repeat the macro)
q    Stop recording

그런 다음 줄 수만큼 매크로를 재생할 수 있습니다 3@a.

편집 으로의 @evilsoup는 버퍼의 모든 라인에 매크로를 실행하기 위해보다 효과적인 방법은 사용하는 것입니다 코멘트에 언급 :

:%normal @q

물론 수정할 줄을 설명 %하는 범위로 바꿀 수 있습니다 .


3
당신은 또한에 모든 라인에 그것을 실행할 수 있습니다:%normal @q
evilsoup

@ evilsoup : 언급 해 주셔서 감사합니다. 답변을 편집하겠습니다.
statox

6

내가하는 방법은 다음과 같습니다.

:%norm y4lA <C-o>p

설명:

:%norm                     "Apply the following keystrokes to every line:
       y4l                 "Yank 4 letters. You could also do 'yiw'
          A                "Add a space to the end
            <C-o>          "Do a single normal command
                 p         "Paste

4

표준 UNIX 명령에 액세스 할 수있는 경우 AWK다음을 사용할 수 있습니다 .

:%!awk '{print $0" "$1}'

실제로 vi / vim 또는 처음 네 문자는 아닙니다.
파이프

1
고려 :help filter하는 빔 기능을 내장하고 실제로, 그것은 매우 VI / Vim의 말을 얼마나 잘 기능이 빔은 UNIX 패러다임에 맞게 할 수 있다는 생각.
romainl

1

나는 이것을하는 기존의 메커니즘이 더 낫다고 생각하지만 시각적 블록 모드를 사용 하여이 작업을 수행 할 수도 있습니다 .

날짜를 복사하십시오.

gg          # Go to the top of the file
<ctrl>y     # Enter visual block mode
G           # Go to the bottom of the file
w           # Select the first word
"jy         # Copy in to the j register

첫 번째 줄의 끝을 채우십시오.

gg      # Top of file
A       # Append the line
        # Some spaces
<ESC>   # Return to command mode

풀:

gg 
# Move right to the length of the longest line
"jp   # Paste the block

참고 그냥 할 수있는 4l대신llll
EvergreenTree

@EvergreenTree-업데이트되었습니다.
sixtyfootersdude

0

유닉스 커맨드 라인에서 (또는 유닉스 커맨드 라인 도구가 설치되어있는 창)

sed -e "s/\(....\)\(.*\)/\1\2 \1" < inputFile > outputFile
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.