2014-01-16 2 views
1

나는 find를 사용하여 디렉토리에서 여러 파일을 가져온 다음 awk에서 문자열을 찾아서 바꾸기 위해 find를 사용한다. 그러나 awk는 파일을 덮어 쓰지 않고 stdout에 파일의 전체 내용을 인쇄합니다. 나는 내 목표를 달성하기 위해 여기서 사용해야하는 구문에 관해서는 다소 혼란 스럽다.awk를 사용하여 찾은 파일에서 문자열을 찾아서 찾는다.

내 명령은 지금까지입니다 :이 SKU+ProductId와 문자열 SKU를 교체하지만 파일을 덮어 쓰기되지

find -iname '*_input.xml' -exec awk -P '/"prop_name" : "ID",/ , /}/ {print sub(/SKU/,"SKU+ProductId")} 1' {} + 

.

어떤 사람이 실종되었는지에 대한 아이디어가 있습니까?

건배!

업데이트 : 예 내용 : 당신은 표준 출력을 리디렉션해야합니다 있도록

  }, 
     "prop_name" : "ID", 
     "rule" : "SKU" 
    }, 
+0

find 명령의'-exec'에 어떻게 맞추는 지 정확히 알 수는 없지만 이것이 작동하지 않는 이유를 설명합니다 : http://stackoverflow.com/questions/9705940 –

답변

3

AWK는, 표준 출력에 기록합니다. 당신은 내부 쉘 명령을 실행하여 find으로 그 작업을 수행 할 수 있습니다

find -iname '*_input.xml' \ 
    -exec sh -c 'for file; do 
     ./awk_script "$file" > "$file.tmp" && mv "$file.tmp" "$file" 
     done' _ {} + 

난 인용 문제를 피하기 위해 자신의 파일에 awk 명령을 이동합니다. 또한 결과를 확인할 때까지 원본 파일을 덮어 쓰는 작업을 저장하는 것이 좋습니다.

이렇게 awk 파일을 만들 수 있습니다. chmod +x을 잊지 마세요.

#!/usr/bin/awk -f 

/"prop_name" : "ID",/ , /}/ { 
    print sub(/SKU/,"SKU+ProductId") 
} 1 
+0

awk_script가 있어야합니다. 찾을 파일과 같은 디렉토리에 있고, .sh가 정확해야합니까? – Rooster

+0

awk 스크립트는 알려진 디렉토리에 있어야합니다. 그것의 확장은 중요하지 않지만,'#!/usr/bin/awk -Pf'를 shebang에 넣을 수 있습니다. – kojiro

+0

이것을 실행하려고하면 구문 오류가 발생합니다. awk 파일의 내용을 보여주기 위해 답을 편집 할 수 있습니까? 몇 가지 예제 콘텐츠를 제공하는 질문을 편집 중입니다. – Rooster

2

GNU SED이 훨씬 쉽게 장소 편집에서의 -i 있습니다

당신은 -i infile와 GNU AWK (4?)의 새로운 틱 버전을 사용할 필요가
find -iname '*_input.xml' \ 
    -exec sed -i '/"prop_name" : "ID",/ , /}/ s/SKU/SKU+ProductId/' {} + 
+0

아,이 기능은 확실히 작동하지만 sed는 multiline 옵션을 지원하지 않습니다. 마이너스's'하지만, 그것이 기본적으로 시행되어야한다는 것을 알려주는 것은 효과가있었습니다. 이것이 awk에 관한 것이기 때문에 나는 받아 들여야하는지 잘 모르지만, def +1 – Rooster

+3

[ed] (http://pubs.opengroup.org/onlinepubs/9699919799/utilities/ed.html)은 사랑을 얻지 못한다. 실제로 파일을 편집 할 수 있도록 설계된 POSIX 호환이며 휴대용입니다. 그러나 GNU가'-i' 플래그를 넣고'sed'를 이식 할 수 없게 만들 때까지 모든 사람들이 가난한'ed'를 잊을뿐만 아니라 모든 사람들이 그것을 어떻게 사용하는지 잊어 버렸습니다. #wahmbulance – kojiro

+0

@kojiro'ed'를'ed'와 같은 uglyness를 삽입 할 필요가 없습니까? –

2

옵션을 선택하고 print을 제거하십시오.

+0

pkgs를 업데이트해야 할 때 사용해 보겠습니다. – Rooster

관련 문제