Vim의 각 줄 끝에 문자열을 어떻게 추가합니까?


256

*Vim의 각 줄 끝에 추가하고 싶습니다 .

코드를 성공적으로 시도하지 못했습니다

:%s/\n/*\n/g

당신 때문에 오른쪽에 작동하지 않는 :s///, \n널 문자에 해당합니다. 이 섹션 :help sub-replace-special은 관련이 있습니다.
doubleDown

답변:


354

:%s/$/\*/g

작동해야합니다. 그래서해야 :%s/$/*/g으로 MrWiggles이 올바르게 지적한다.


모든 줄의 길이가 같지 않으므로 15 번째 열에 ' ' 가있을 수 있지만 25 번째 열에 2 줄에 '*'가 있을 수 있으므로 동일한 열에 ' ' 를 삽입하는 방법이 있습니까?
Aman Jain

11
한 줄에 하나의 EOL 만 있으므로 g플래그는 필요하지 않습니다.
doubleDown

나는 각 줄의 시작 부분에 /를 추가하고 싶었습니다 : 1, $ s / ^ / \ / g 나를 위해 일했습니다.
farooqsadiq

@dirkgently 어떻게 문자열 변수를이 명령의 인수로 전달할 수 있습니까 (* 대신에 아시나요?)?
Matheus Rotta

353

: search 명령보다 짧습니다.

:%norm A*

이것이 의미하는 바입니다.

 %       = for every line
 norm    = type the following commands
 A*      = append '*' to the end of current line

28
남자, 내가 배우지 않은 vi 또는 vim 스레드가 없습니다. 오늘 나는 규범에 대해 배웁니다. 그리고 그들이 건배에서 "노름!"
smcameron

4
앞에 추가하려면 0i *를 사용하고, 0은 줄의 시작 부분, i는 삽입 모드, *는 *로 이동합니다. D :
Rob

7
VimGolfer 로서 나는 당신에게 한 번의 키 입력을 절약 I*하기보다는 그것을 사용하여 추가 할 수는 없습니다 0i*.
Jedidiah

24
다른 팁 : 범위에도 적용됩니다. 시각적 모드에서 행을 강조 표시하고을 누르면 :다음 명령을 미리 채울 :'<,'>수 있습니다.:'<,'>norm A*
Jedidiah Hurt

8
더하기, I대신 사용하십시오 –:%norm I*
Just Lucky 정말

42

또한:

:g/$/norm A*

또한:

gg<Ctrl-v>G$A*<Esc>

아아 ... 두 번째 줄도 여러 줄로 사용할 수 있습니다. 좋은!
Tim Fletcher

첫 번째 예를 설명해 주시겠습니까?
코디 폴

@CodyPoll gglobal모든 일치하는 줄로 무언가를 수행하는 명령입니다. $모든 줄과 일치합니다. ^또는 일 수도 있습니다 .*. norm은 일반적으로 명령 모드에서 사용하는 명령을 실행합니다. 따라서 줄의 끝에 A*추가 *하는 것을 의미 합니다.
defhlt

41

비주얼 블록 모드를 사용하는 것이 이러한 유형의 문제를 처리하는 데 더 좋고 다양한 방법이라고 생각합니다. 예를 들면 다음과 같습니다.

This is the First line.  
This is the second.  
The third.

"Hello world"를 삽입하려면 이 각 줄의 끝에 (공백 + 클립 보드) :

  • 첫 번째 행의 문자에서 Ctrl-V를 누르십시오 (또는 Ctrl-V를 붙여 넣으면 Ctrl-Q).
  • jj를 눌러 시각적 블록을 세 줄로 확장합니다.
  • $를 눌러 시각적 블록을 각 줄의 끝까지 확장합니다. A를 누른 다음 공백을 누른 다음 Hello world를 입력하십시오. + 그런 다음 Esc.

결과는 다음과 같습니다.

This is the First line. Hello world.  
This is the second. Hello world.  
The third. Hello world.  

( Vim.Wikia.com의 예 )


3
jj하나 를 누르는 대신 G마지막 줄로 이동할 수 있습니다 . j마지막 줄에 닿을 때까지 누르는 것이 실용적이지 않은 큰 파일에 유용합니다 .
nash

시각적 블록이 여기에서 가장 깨끗하고 더 확장 가능하다는 데 동의하십시오.
Peter Dolan

이것은 처음에는 모든 라인에서 작동하는 것처럼 보이지 않지만 Esc 키를 누르면 모든 라인에 추가되어 추가됩니다.
누 메논

비주얼 블록은 VS 코드와 같은 다른 것들에 대한 확장으로 vim을 사용할 때 문제와 오류를 일으 킵니다. 이 경우, 원래 사용자가 요구하는 검색 및 교체가 신뢰할 수있는 옵션입니다.
Brettins

대문자 A를 사용해야합니다. 소문자 "a"는 작동하지 않습니다.
Jeff Hoye

14

각 줄의 끝에 Hello world를 추가하려면 다음을 수행하십시오.

:%s/$/HelloWorld/

특정 라인 수에 대해이 작업을 수행하려면 20 ~ 30을 사용하십시오.

:20,30s/$/HelloWorld/

각 줄의 시작 부분 에서이 작업을 수행하려면 다음을 사용하십시오.

:20,30s/^/HelloWorld/

6

당신은 정말로 g끝에 필요하지 않습니다 . 따라서 다음과 같이됩니다.

:%s/$/*

또는 *끝 부분을 원한다면 14-18 행을 말합니다.

:14,18s/$/*

또는

:14,18norm A*

5

... 각 줄 앞에 *를 붙이려면 (시작을 추가하십시오),

%s/^/*/g

이것은 질문에 대답하지 않습니다.
doubleDown

5

하나의 옵션은 다음과 같습니다.

:g/$/s//*

이것은 모든 라인 엔드 앵커를 찾아서로 대체합니다 *. 나는 "대체"라고 말하지만 실제로 앵커는 일반 문자가 아닌 특별한 것이기 때문에 추가 사항입니다. 자세한 내용 은 g- 예제를 참조하십시오 .


정규식에서 s //는 무엇을 의미합니까? 비슷한 명령을 알고 있습니다 : : g / / / p, (grep). 나는 당신의 명령이 적어도 구조에서 내 것에 가깝다는 것을 확신합니다.
Léo Léopold Hertz 준영

1
s는 대용입니다-줄 끝 앵커를 별표로 바꿉니다 (앵커 포인트이므로 실제로 그것을 대체하지는 않습니다).
paxdiablo 2013

3
: % s / \ n / * \ r / g

첫 번째 것은 다른 곳에서는 정확하지만 Vim은 어떤 이유로 다른 줄 바꿈 처리를해야합니다.


내 버전의 Vim \ n에서 작동하지만 이것은 줄 바꿈을 *로 대체하여 효과적으로 줄을 결합합니다.
Nathan Fellman

1
이 명령은 내가 시도한 모든 버전의 Vim에서 제대로 작동하는지 확인되었습니다. Windows 버전을 사용하고 있습니까?

1
%s/\s*$/\*/g

이것은 트릭을 수행하고 선행 공백이 무시되도록합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.