특히 grep과 sed

특히 grep과 sed

*.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(?<!...)sedssedperl

grep -Pr --include='*.tex' -lZ '\{fig/[^}]*(?<!\.png)\}' . |
  xargs -r0 perl -pi.back -e 's:(\{fig/[^}]*(?<!\.png))\}:$1.png}:g'

사용 시 -i.back원본 파일은 확장자로 저장됩니다 .back.

답변2

패턴 검색을 동시에 수행할 수 있으므로 사용 시에는 sed필요하지 않습니다 .grepsed

{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첨부되었고 다른 콘텐츠는 영향을 받지 않은 것을 볼 수 있습니다 .

관련 정보