다음과 같은 데이터가 포함된 파일이 있습니다.
ab001
ab002
ab003
ab004
"ab"로 시작하는 모든 단어를 "ab001"로 바꿔야 합니다. 즉, 변경 후 파일은 다음과 같아야 합니다.
ab001
ab001
ab001
ab001
%s/ab*/ab001/g
편집기 에서 시도 했지만 VI
예상한 결과가 나오지 않았습니다. 나는 또한 Google을 시도했지만 어떤 해결책도 찾지 못했습니다.
답변1
이걸로 표시했으니까육처음에 vi에 관해 질문을 주셨는데요, vi에서 왜 작동하지 않는지, 어떻게 해결하는지 설명드리겠습니다. 처음에 다음을 시도했다고 말씀하셨습니다.
%s/ab*/ab001/g
검색은 *
이전 원자를 0회 이상, 가능한 한 많이 일치시키는 방식으로 작동합니다. 에서 :h /*
:
*/star* */\star*
* (use \* when 'magic' is not set)
Matches 0 or more of the preceding atom, as many as possible.
이 경우 이전 원자는 "b"이므로 이 검색은 다음 중 하나와 일치합니다.
a
ab
abbb
abbbbbbbbbbbbbbbbbbb
또한 일치 ab001
하지만 첫 번째 부분만 일치하므로 일치 항목은 입니다 (ab)001
. Vi는 당신이 이것을 찾고 있다는 것을 발견하고 그것을 (ab001)001
. 해결책은 간단합니다. 당신은 일치하고 싶어
'ab' 다음에 아무 것도 나오지 않음
점 문자( .
)는 개행 문자를 제외한 모든 문자와 일치합니다. 그래서 검색해보면
/ab.*/
일치할 것이다아무것"ab"로 시작하세요. 그래서 당신은 다음을 원합니다:
:%s/ab.*/ab001/g
일치하는 항목이 너무 많은 경우(예: "절대적으로"와 같은 단어) 숫자만 찾도록 단순화할 수 있습니다. 예를 들어, "ab" 뒤에 임의의 숫자가 오는 경우와 일치합니다.
/ab\d*/
이는 "ab" 뒤에 세 자리 숫자가 오는 것과 일치합니다.
/ab\d\{3}/
북마크 추천드려요이 페이지빠른 vi-regex 참조. 특정 정규식 문제를 해결하는 데 매우 유용하다는 것을 알았습니다.
답변2
awk
다음을 사용하여 이 작업을 수행할 수 있습니다.
cat input_file | awk '{if($1~/^ab/){print "ab001"}else{print $0}}'
첫 번째 필드가 "ab"로 시작하면 파일이 검색 되고 awk
해당 문자를 사용하여 "ab001"로 대체됩니다. 이는 선택한 필드를 ^
의미하며 , 그렇지 않으면 레코드가 있는 그대로 인쇄됩니다.start of
답변3
Perl oneliner를 사용해 보겠습니다.
perl -i.bak -pe 's/\bab.*?\b/ab001/g;' [file(s)]
단어 경계에서 "ab"로 시작하는 모든 요소를 찾아 "ab001"로 바꾸는 정규식
나는 이 파일을 만들었습니다: ab001
ab002
ab003
ab004
ab005 ac001
ad0032 ab006
이 Perl 스크립트는 다음과 같은 출력을 생성했습니다.
ab001
ab001
ab001
ab001
ab001 ac001
ad0032 ab001
나는 이것이 당신이 원하는 것이라고 생각합니다.
내가 사용한 다른 옵션은 링크의 Perl 문서를 통해 가장 잘 설명됩니다.perlrun - Perl 인터프리터를 실행하는 방법
답변4
시도해 봤어?
$ sed 's/ab\(.\+\)/ab001/g' -i file.txt
또는
$ sed 's/\(^ab\).*/ab001/g' -i file.txt
나는 이것이 더 쉽고 더 나은 방법이라고 생각합니다. 이것이 당신이 찾고 있는 것이기를 바랍니다.