2012-06-29 2 views
0

다음과 같은 문제가 있습니다 - 특정 디렉토리 아래 모든 XML 파일을 트래버스하고 특정 접두사로 찾으려는 모든 id -s 접두어를 붙이고 싶습니다. > {} 작동하지 않습니다 - find 및 awk를 사용하여 파일 내용을 어떻게 바꿀 수 있습니까?

#!/bin/bash 
find . -iregex .+?\.xml -print -exec awk '{print gensub(/(.*?)=\"(@(\+|)id)\/(.+)\"/, "\\1=\"\\2/prefix_\\4\"", "g", $1);}' {} > {} \; 

가 리디렉션 부분은 그러나 : 나는 그렇게 다음 스크립트를 작성했습니다. 스크립트는 정상적으로 실행되고 stdout에서 예상대로 모든 것을 출력하지만 awk에서 읽은 것과 동일한 파일로 출력을 리디렉션 할 수없는 것으로 보입니다. 이 아이디어를 어떻게 피할 수 있을까요? 감사! 대신 비난하는

+0

그냥 분명히하기 위해, * 동시에 파일에 쓰는 동안 파일에서 읽고 싶습니까? – Levon

+0

아니요. awk print ... {}'가 awk가 읽은 파일로 리디렉션 될 내용을 출력 할 것으로 예상합니다. 그것은 불가능한 것 같다. – asenovm

답변

0

Exec에서 :

find . -iregex .+\.xml -print \ 
-exec bash -c "awk '{print gensub(/(.*?)=\\"(@(\+|)id)\/(.+)\\"/, \"\\1=\"\\2/prefix_\\4\\"\", \"g\", \$1);}' {} > {}.NEW" \; 

완전히 당신이 (내가 리디렉션하고있어 파일에 .NEW을 추가 한 이유입니다) 생각에서 읽고있는 파일을 덮어 쓰게됩니다. 아마도 당신이 원했던 것은 >> (append) 리디렉터 였을까요?


질문에 예제 파일을 제공하지 않았기 때문에 전체 예제를 작성하는 것이 어렵습니다. 다음이 포함 tmp.xml라는 이름의 파일이있는 경우

: 그러나 다음 작품

I have a " 
I do not 

및 다음 실행

find . -name '111.xml' -exec bash -c "awk '\$0 ~ /\"/ { print \$0 }' {} > {}.NEW" \; 

파일 tmp.xml.NEW가 포함됩니다

I have a " 

큰 따옴표 외에 yo 쉘은 변수를 변수로 취급하므로 스크립트에서 달러 ($)를 벗어나야합니다.

+0

적절한 탈출 후에도 작동하지 않습니다. 나는 세 번째 파일을 사용하여 출력으로 리다이렉션하여 복사 한 결과로 복사했는데, 그다지 만족스럽지 않다. 더 좋은 방법이 있습니까? – asenovm

+0

@asenovm 제 편집을보세요. –

관련 문제