정규식을 사용하여 찾기 및 바꾸기


25

많은 사용자 기본값이있는 파일이 있습니다. 텍스트를 변경하고 싶지만 matcher와 replacer를 만드는 데 어려움을 겪고 있습니다. 다음 예제를 사용하십시오.

###############################################################################
# Trackpad, mouse, keyboard, Bluetooth accessories, and input                 #
###############################################################################

# Trackpad: enable tap to click for this user and for the login screen
defaults write com.apple.driver.AppleBluetoothMultitouch.trackpad Clicking -bool true

나는 대체하고 싶습니다 # Trackpad: ...으로running "Trackpad: ..."

문제를 해결하면서 정규식 테스터를 사용하여 무언가를 생각해 냈습니다.

/\n\n#\s(.*)/g

Vim에서 이것을 사용하려고하면 효과가 없습니다.

:/\n\n#\s(.*)/running "\1"/g

내 문제는 두 가지 구체적인 질문으로 요약됩니다.

  1. \n문자 검색을 피하고 #검색 그룹 끝에 표시되지 않도록하려면 어떻게 해야 합니까?
  2. 캡처 그룹을 효과적으로 사용하려면 어떻게해야합니까?

아래에 좋은 답변이 있습니다. 세 가지 모두를 선택하기는 어렵지만 선택한 답변이 내 원래 사양에 가장 정확하다고 생각합니다. 실제 파일 로 세 가지 답변을 모두 시도하여 그에 대한 느낌을 확인하는 것이 좋습니다 .

답변:


18

분명히하기 위해… 나는 이것이 당신이 대체의 결과가되도록 요청했다고 생각합니까?

###############################################################################
# Trackpad, mouse, keyboard, Bluetooth accessories, and input                 #
###############################################################################

running "Trackpad: enable tap to click for this user and for the login screen"
defaults write com.apple.driver.AppleBluetoothMultitouch.trackpad Clicking -bool true

이 경우 다음 명령을 권장합니다.

:%s/\n\n#\s\+\(.*\)/^M^Mrunning "\1"/

패턴 설명

:s/PATTERN/REPLACEMENT/는 IS 대체 명령. 백분율 기호 :%s는 현재 행이 아니라 전체 파일에서 작동합니다.

\n\n따르면 관심있는 줄은 빈 줄 다음에 나타나야합니다. 앞의 빈 줄에 신경 쓰지 않는다면 ^충분할 것입니다.

#\s\+하나 이상의 공백 문자가 뒤에 오는 해시 문자와 일치합니다. \(.*\)라인의 모든 후속 텍스트를 캡처합니다.

대체 텍스트 설명

^M^M\n\n패턴에 있던 것을 대체하기 위해 선의 두 끝을 삽입합니다 . 그렇지 않으면 텍스트가 빈 줄 앞의 줄 끝으로 이동합니다. 각각을 입력하려면를 ^M누르십시오 Ctrl-V Ctrl-M.

그런 다음 문자열을 삽입하고 running큰 따옴표 안에 괄호로 묶인 내용을 삽입하십시오 .


귀하의 답변을 편집 할 수 없지만 귀하가 의도 한 것으로 생각합니다 :%s/\v\n\n#\s+(.*)/^M^Mrunning "\1"/( "매직"플래그 추가). 내 원래 질문에 대한 정답을 선택하는 것은 정말 어렵지만이 답변이 내 원래 예상 답변과 가장 비슷하다고 생각합니다. 또한 범위를 선택할 필요없이 전체 파일에서 작동하는 유일한 파일입니다.
squarefrog

1
새 줄을 얻는 \r대신 사용할 수있는 IIRC ^M?
muru

11

나는 다음과 같은 것을 사용할 것이다 :

:s/^#\s\+\(.\{-}\):/running "\1":/
  • ^##줄의 시작 부분에 고정 된 문자 와 일치시키기 위해 (질문 1에 답합니다)
  • \s\+ 공백을 한 번 이상 일치 시키려면
  • \( 그룹을 시작하려면 (질문 2에 답)
  • .\{-}\탐욕스럽지 않은 방식으로 어떤 문자를 0 번 이상 일치 시키는 것 ; 이에서 diffferent입니다 .*그것을 최대한 가능한 적게 일치 시도, 그리고 그에서. :주석에 문자를 추가하여 이것이 왜 중요한지 보십시오.
  • \) 하위 그룹을 종료합니다.
  • : 리터럴과 일치 :

그런 다음이 텍스트를 원하는 텍스트로 바꾸고 \1캡처 한 그룹을 나타내는 데 사용 합니다.

정규식 테스터를 사용하여 무언가를 생각해 냈습니다.

정규 표현식 구문은 wiki 구문과 비슷합니다. 많은 것들이 있습니다. 모두 한 눈에 비슷하게 보이지만 다른 것보다 낫지는 않지만 많은 차이점이 있습니다.

오늘날 소위 "Perl 호환"정규 표현식은 대부분의 언어에서 사실상 기본값이지만 Vim 정규 표현식은 Perl 호환 표현식과 호환 되지 않습니다 ! Vim regexp 구문은 Perl이 없었을 때 적어도 '70'으로 돌아갑니다.

하위 그룹에서이를 확인할 수 있으며 사용 \(하지 않아야합니다 ((POSIX '기본'구문과 호환되지만보다 일반적인 POSIX '확장'구문 또는 Perl 구문과는 호환되지 않습니다). \v패턴으로 플래그를 추가하여이를 제어 할 수 있습니다 (자세한 내용 :help /\v은 참조). "더 호환성이 있지만"완전하지는 않습니다 ( .{-}예를 들어, 욕심이없는 일치 에는 계속 사용해야 함 )

따라서 이것은 "정규식 테스터"를 사용하는 것이 거의 작동하지 않는 이유를 설명 할 수 있습니다.

http://www.vimregex.com/ Vim regexps의 좋은 개요 / 치트 시트.


1
특히 정규식! = 정규식에 대한 훌륭한 대답. 검색과 교체에 관해서는 주석에가 있거나 없을 수 있으므로 약간 까다 롭습니다 :. 자세한 내용은 전체 파일을 참조하십시오 github.com/squarefrog/dotfiles/blob/master/osx/…
squarefrog

8

당신은 할 수 있습니다 :

  • 끝나지 않는 줄을 검색하십시오 #.:/[^#]$/
  • #\s(.*)줄의 시작 부분에서 교체하십시오 .s/\v^#\s(.*)/running "\1"/

그룹을 사용하려면 다음 중 하나를 수행해야합니다.

  • 대괄호를 이스케이프하여 정규식 구문의 일부가되도록합니다. \(.*\)또는
  • 다음 과 같이 표현식을 시작하여 "magic" 을 사용 하십시오 \v.s/\v...

그것을 결합 :

:/[^#]$/s/\v^#\s(.*)/running "\1"/

1
이것은 내가 쓰는 데 필요한 텍스트가 아니라 태그의 의미에 대한 설명을 포함하여 훌륭하게 작동합니다.
squarefrog

정규식 구문의 일부가 되려면 대괄호를 이스케이프 처리해야합니다. 나는 정규식 그룹이 작동하도록하는 데 항상 문제가있었습니다.
Adama
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.