사용자 기본값이 많은 파일이 있습니다. 일부 텍스트를 변경하고 싶지만 어려움을 겪고 있습니다. 매처와 대체자가 등장합니다. 다음 예를 사용하면 다음과 같습니다.
############################################################################### # 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
내 문제는 두 가지 구체적인 질문으로 요약됩니다.
-
\n
문자 검색을 피하고 대신#
가 나타나지 않도록하려면 어떻게해야합니까? 검색 그룹의 끝에 있습니까? - 캡처 그룹을 효과적으로 사용하려면 어떻게해야합니까?
아래에 몇 가지 훌륭한 답변이 있습니다. 세 가지 중 하나를 선택하기는 어렵지만 선택한 답변이 원래 사양에 가장 정확하다고 생각합니다. 실제 파일 과 함께 세 가지 답변을 모두 시도하여 답변에 대해 어떻게 생각하는지 확인하는 것이 좋습니다.
답변
명확히 말씀 드리면…이 질문이 대체 결과라고 요청하신 것 같습니다.
############################################################################### # 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/^#\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 정규식 구문의 일부가되기 위해 이스케이프되어야합니다. 정규식 그룹이 작동하도록하는 데 항상 문제가있었습니다.
:%s/\v\n\n#\s+(.*)/^M^Mrunning "\1"/
(" 마법 플래그). 선택하기가 정말 어렵습니다. 내 원래 질문에 대한 정답이지만이 답변이 원래 예상 답변에 가장 가깝다고 생각합니다. 또한 범위를 선택할 필요없이 전체 파일에서 작동하는 유일한 것입니다.\r
를 사용할 수 있습니다. c63256aa19 “>