마이그레이션 프로세스를 위해 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
추가 자료:
- 찾기 결과를 반복하는 것이 왜 나쁜 습관입니까?
find
- 옵션 사용을 포함하여 명령 사용에 대한 많은 세부 정보가 있습니다-exec
. - xargs는 언제 필요합니까?