정규식 패턴 및 대체 줄

정규식 패턴 및 대체 줄

마이그레이션 프로세스를 위해 bash 스크립트에서 일부 대체 작업을 수행해야 합니다.

따라서 내 .txt 파일에는 다음과 같은 인용문이 있습니다.

[[File:My Image.png|400px|thumb|center|My Image]]
[[File:My Image.png|400px|thumb|center]]
[[File:My Image.png|400px|thumb]]
[[File:My Image.png|400px]]
[[File:My Image.png]]

내가 해야 할 일은 이러한 모든 이벤트를 다음 줄로 바꾸는 것입니다(따라서 더 이상 크기, 설명 또는 기타 정보는 없습니다).

[[File:My Image.png]]

그래서 모든 이미지 이름을 추출하기 위해 PCRE 정규식을 작성해 보았습니다.

/File:(.*\..{3})/g

.txt 파일에서 일치하는 모든 항목을 찾고 정규식을 사용하여 이미지 이름을 추출하기 위해 다음 최종 명령을 작성했습니다.

find . -name "*.txt" | xargs perl -i -p -e 's/File:(.*\..{3})/$1/g'

그러나 몇 가지 문제가 발생했습니다.

  • 실수:

xargs: 끝나지 않은 인용문

  • 마지막으로 모든 항목(전체 행)을 추출된 이미지 이름으로 바꾸는 방법을 모르겠습니다.

추신: 저는 MacOS 시스템에서 bash v4를 사용하고 있습니다.

답변1

나는 썼다새로운 정규식전체를 일치시키고 [[...]], 유지하고 싶은 것만으로 교체해 줍니다. 파일 이름에 파이프 |문자나 종결자가 포함되어 있지 않다고 가정합니다 ]]. 으로 문제를 재현할 수는 없지만 어쨌든 다음은 Linux에서 작동하는 s 옵션 xargs으로 대체했습니다 .find-exec

find . -name "*.txt" -exec perl -i -pe 's/(\[\[File:[^|]*).*?(\]\])/$1$2/g' '{}' +

답변2

노력하다

find . -name '*.txt' -exec perl -i -pe 's/File:[^|]+\K\|[^]]+//g' {} \;
  • File:[^|]+문자가 아닌 문자가 File:뒤따르는 일치|
  • \K이렇게 하면 이전 문자열을 캡처하여 교체 부분에 다시 넣을 필요가 없습니다.
  • \|[^]]+제거할 문자가 아닌 항목이 |뒤에 오는 일치 항목]
  • sed -i '' 's/\(File:[^|]*\)|[^]]*/\1/g'대신 사용할 수도 있습니다perl

추가 자료:

관련 정보