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

사용자 기본값이 많은 파일이 있습니다. 일부 텍스트를 변경하고 싶지만 어려움을 겪고 있습니다. 매처와 대체자가 등장합니다. 다음 예를 사용하면 다음과 같습니다.

############################################################################### # 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. 캡처 그룹을 효과적으로 사용하려면 어떻게해야합니까?

아래에 몇 가지 훌륭한 답변이 있습니다. 세 가지 중 하나를 선택하기는 어렵지만 선택한 답변이 원래 사양에 가장 정확하다고 생각합니다. 실제 파일 과 함께 세 가지 답변을 모두 시도하여 답변에 대해 어떻게 생각하는지 확인하는 것이 좋습니다.

답변

명확히 말씀 드리면…이 질문이 대체 결과라고 요청하신 것 같습니다.

############################################################################### # 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/ 대체 명령입니다. :%s의 백분율 기호는 현재 행이 아닌 전체 파일에서 작동합니다.

\n\n는 관심 줄이 빈 줄 뒤에 와야한다고 말합니다. 앞의 빈 줄에 신경 쓰지 않았다면 ^면 충분합니다.

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

대체 텍스트 설명

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

그런 다음 running 문자열을 삽입 한 다음 큰 따옴표 안에 괄호 안에 캡처 한 내용을 삽입합니다.

댓글

  • 답변을 수정할 수 없지만 :%s/\v\n\n#\s+(.*)/^M^Mrunning "\1"/ (" 마법 플래그). 선택하기가 정말 어렵습니다. 내 원래 질문에 대한 정답이지만이 답변이 원래 예상 답변에 가장 가깝다고 생각합니다. 또한 범위를 선택할 필요없이 전체 파일에서 작동하는 유일한 것입니다.
  • IIRC는 iv id = “대신 \r를 사용할 수 있습니다. c63256aa19 “>

새 줄을 얻으려면?

답변

다음과 같은 것을 사용합니다.

:s/^#\s\+\(.\{-}\):/running "\1":/ 
  • ^# 고정 된 # 문자와 일치 줄의 시작 부분 (질문 1에 답변)
  • \s\+ 공백을 한 번 이상 일치
  • \( 그룹을 시작하려면 (질문 2에 답변)
  • .\{-}\를 사용하여 탐욕스럽지 않은 방법 ; 이것은 .*와 다릅니다. 가능한 한 적게 일치시키고 가능한 한 많이 일치 시키지는 않습니다. 댓글에 : 문자를 추가하여 하위 그룹을 종료하는 데 중요한 이유를 확인하세요.
  • \)

li>

  • :는 리터럴 :
  • 와 일치합니다. 그런 다음이를 텍스트로 바꿉니다. 원하는 그룹을 참조하려면 \1를 사용하세요.

    정규식 테스터

    정규식 구문은 위키 구문과 약간 비슷합니다. 여러 개가 있고 모두 한 눈에 닮았지만 모두가 없습니다. 분명히 다른 어떤 것보다 낫지 만 많은 차이점이 있습니다.

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

    \(( (POSIX “기본”구문과 호환되지만보다 일반적인 POSIX “확장”구문 또는 Perl 구문과는 호환되지 않음).패턴에 \v 플래그를 추가하여이를 제어 할 수 있습니다 ( :help /\v (자세한 내용은 / a> 참조), 이렇게하면 “더 호환”되지만 완전하지는 않습니다 (예를 들어 탐욕스럽지 않은 일치에는 여전히 .{-}를 사용해야합니다).

    그러면 “정규식 테스터”를 사용하는 것이 거의 효과가있는 이유를 설명 할 수 있습니다.

    http://www.vimregex.com/ 는 Vim 정규 표현식의 좋은 개요 / 치트 시트입니다.

    댓글

    • 특히 regex! = regex 인 이유에 대한 좋은 답변입니다. 검색 및 바꾸기의 경우 댓글에 :가있을 수도 있고 없을 수도 있으므로 ' 약간 까다 롭습니다. 자세한 내용은 전체 파일을 참조하십시오. github.com/squarefrog/dotfiles/blob/master/osx/ …

    답변

    다음을 수행 할 수 있습니다.

    • 종료되지 않는 줄 검색 # : :/[^#]$/
    • 시작 부분에서 #\s(.*) 바꾸기 줄 : s/\v^#\s(.*)/running "\1"/

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

    • 대괄호를 이스케이프하여 정규식 구문의 일부가됩니다. \(.*\) 또는
    • “magic” 사용 \v로 시작 : s/\v...

    결합 :

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

    댓글

    • 이것은 내가 필요한 텍스트가 아닌 태그가 의미하는 바에 대한 설명을 포함하여 훌륭하게 작동합니다. 쓰기.
    • 괄호 안에 t가 있음을 분명히 해주셔서 감사합니다. o 정규식 구문의 일부가되기 위해 이스케이프되어야합니다. 정규식 그룹이 작동하도록하는 데 항상 문제가있었습니다.

    답글 남기기

    이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다