*.tex 파일의 모든 줄을 다음 정보로 바꾸는 방법을 찾으려고 합니다. 예를 들면 다음과 같습니다.
text{fig/titel/Logo}text
도착하다
text{fig/titel/Logo.png}text
나는 시도했다:
egrep --include=*.tex -r ".*{fig/.*" *
변경하려는 행을 제공합니다. 하지만 예를 들어 sed 명령을 어떻게 추가로 사용할 수 있습니까?
나는 find와 sed를 사용해봤지만 grep과 sed는 사용해본 적이 없습니다. 누구든지 도와줄 수 있나요?
답변1
GNU
(사용 중인 것으로 보이는) 가상 도구:
grep -r --include='*.tex' -lZ '{fig/.*}' . |
xargs -r0 sed -i.back 's:\({fig/[^}]*\)}:\1.png}:g'
grep
업데이트할 파일 목록을 찾아 sed
해당 파일만 업데이트하세요.
.png
또는 존재하지 않는 경우를 추가하려는 경우 GNU에는 부정형 후방 검색 연산자가 포함된 PCRE 정규식 옵션이 grep
있지만 GNU에는 ( 동일한 계열에 속함에도 불구하고) 아직 하나도 없으므로 다음으로 전환하십시오.-P
(?<!...)
sed
ssed
perl
grep -Pr --include='*.tex' -lZ '\{fig/[^}]*(?<!\.png)\}' . |
xargs -r0 perl -pi.back -e 's:(\{fig/[^}]*(?<!\.png))\}:$1.png}:g'
사용 시 -i.back
원본 파일은 확장자로 저장됩니다 .back
.
답변2
패턴 검색을 동시에 수행할 수 있으므로 사용 시에는 sed
필요하지 않습니다 .grep
sed
{fig/
이 경우에는 문자열을 찾은 다음 문자열을 추가하는 매우 간단한 표현식입니다.png
}
이제 끝 문자에서 멈추고 싶기 때문에 검색 표현식이 좀 더 스마트해져야 하지만 이는 정상입니다. 또한 행당 둘 이상이 있을 수 있다는 점도 고려해야 합니다.
그래서 우리는 결국
sed 's!{\(fig/[^}]*\)}!{\1.png}!g'
예를 들어:
$ cat x
untouched lines
text{fig/titel/Logo}text
more lines
text{fig/somethingelse/image}text
text{fig/stuff}text and {fig/morestuff}text
$ sed 's!{\(fig/[^}]*\)}!{\1.png}!g' x
untouched lines
text{fig/titel/Logo.png}text
more lines
text{fig/somethingelse/image.png}text
text{fig/stuff.png}text and {fig/morestuff.png}text
{fig/...}
이제 항목이 png
첨부되었고 다른 콘텐츠는 영향을 받지 않은 것을 볼 수 있습니다 .