awk 및 find를 사용한 다중 파일 리디렉션

awk 및 find를 사용한 다중 파일 리디렉션

내 디렉토리에 일부 파일이 있습니다. .dll을 사용하여 파일의 상단과 끝에 몇 줄을 추가하고 싶습니다 awk.

예: 내 awk명령:

awk 'BEGIN { print "line1\nline2" } { print $0 } END { print "line3\nline4" }' file |tee file

line1위 명령을 사용하면 상단 & 끝에 &를 추가할 수 있습니다 .line2line3line4file

이제 현재 디렉터리에 있는 모든 파일에 대해 동일한 작업을 수행하고 싶습니다.

내가 사용하는 경우:

awk 'BEGIN { print "line1\nline2" } { print $0 } END { print "line3\nline4" }' *

그런 다음 터미널 화면에 출력이 표시되지만모든 파일로 리디렉션하거나 덮어쓸 수 없습니다..

그래서 다음을 시도했습니다(To find+ awk).

find -type f -exec awk 'BEGIN { print "line1\nline2" } { print $0 } END { print "line3\nline4" }' '{}' \;

위의 명령을 사용하여 화면에 출력을 인쇄할 수 있습니다.파일 덮어쓰기,

다음을 시도했지만(으로 find++ awk덮어쓰기 tee) 오류가 발생했습니다.

$ find -type f -exec awk 'BEGIN { print "line1\nline2" } { print $0 } END { print "line3\nline4" }' '{}' | tee '{}' \;
find: missing argument to `-exec'

그럼 어떻게 사용하나요?awk도착하다씌우다(예: AND |tee또는 다른 것)모든 파일에 대해명령을 통해 현재 디렉토리에 있습니까?

답변1

awkGNU 4.1 이상 사용 :

find . -type f -exec awk '
   @load "inplace"
   BEGINFILE {
     inplace_begin(FILENAME, "")
     print "line1\nline2"
   }
   {print}
   ENDFILE {
     print "line3\nline4"
     inplace_end(FILENAME, "")
   }' {} +

답변2

결정 1: sed대신 GNU를 사용하세요awk

sed -i -e '1 i\line1\nline2' -e '$ a\line3\nline4' ./* 

결정 2: 디렉토리의 각 파일에 대해 루프를 사용합니다.

for file in ./*
do
  awk '
       BEGIN { print "line1\nline2" }
       { print $0 }
       END { print "line3\nline4" }
      ' "$file" > "$file".tmp &&
    mv -f "$file".tmp "$file"
done

관련 정보