이 질문이 나열되었을 수 있지만 정확한 답변을 찾을 수 없습니다.
파일을 찾아보고, 패턴을 일치시키고, 다른 것으로 바꾸려고 합니다. 그런데 다른 곳에도 패턴이 나타나는데 길이가 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
지루해집니다.
이것의 장점은 첫 번째 또는 마지막 필드가 양쪽 끝으로 분리되지 않더라도 |
해당 필드에서 대체가 발생한다는 것입니다.