처음 n자를 기준으로 단어 바꾸기

처음 n자를 기준으로 단어 바꾸기

다음과 같은 데이터가 포함된 파일이 있습니다.

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

나는 이것이 더 쉽고 더 나은 방법이라고 생각합니다. 이것이 당신이 찾고 있는 것이기를 바랍니다.

관련 정보