GNU 패턴은 정확한 문자 수와 일치하고 대체됩니다.

GNU 패턴은 정확한 문자 수와 일치하고 대체됩니다.

이 질문이 나열되었을 수 있지만 정확한 답변을 찾을 수 없습니다.

파일을 찾아보고, 패턴을 일치시키고, 다른 것으로 바꾸려고 합니다. 그런데 다른 곳에도 패턴이 나타나는데 길이가 17자인 것만 바꾸면 됩니다.

예:

콘텐츠:

dlkfhfd|fedfe|dfwe3f347fde|3745978|dlkfhr**|376663781736102|**fedfe|dfwe3f347fde

예상하다:

dlkfhfd|fedfe|dfwe3f347fde|3745978|dlkfhr**|37xxxxxxxxxxxxx|**fedfe|dfwe3f347fde

진행 상황: 표현식을 정규식 패턴과 일치시킬 수 있습니다.**\|37[0-9]{13}\|**

그러나 에 넣으면 sed파일의 모든 내용이 대체됩니다.

sed -e s/\|37[0-9]{13}\|/\|37xxxxxxxxxxxxx\|/g

내 sed 버전은 4.2.2입니다.

답변1

정규식은 기본 정규식과 확장 정규식이 혼합되어 있습니다.

확장 정규식( {13}\|리터럴 파이프 사용):

sed -E 's/\|37[0-9]{13}\|/|37xxxxxxxxxxxxx|/g'

또는 기본 정규식으로( \{13\}|리터럴 파이프 사용):

sed 's/|37[0-9]\{13\}|/|37xxxxxxxxxxxxx|/g'

그러면 예제 문자열이 다음과 같이 바뀔 것입니다.

dlkfhfd|fedfe|dfwe3f347fde|3745978|dlkfhr**|37xxxxxxxxxxxxx|**fedfe|dfwe3f347fde

|또한 해당 부분은 정규식으로 해석되지 않으므로 표현식의 대체 부분을 이스케이프 처리할 필요가 없습니다 .


존재하다 awk:

awk -F '|' -vOFS='|' '
    {
        for (i=1; i<=NF; ++i))
            if (length($i)==15 && match($i,"^37[0-9]"))
                $i="37xxxxxxxxxxxxx"
        print 
     }'

여기에서 사용할 수 있지만 gsub()그렇게 하면 솔루션과 거의 동일해져서 sed지루해집니다.

이것의 장점은 첫 번째 또는 마지막 필드가 양쪽 끝으로 분리되지 않더라도 |해당 필드에서 대체가 발생한다는 것입니다.

관련 정보