내 디렉토리에 일부 파일이 있습니다. .dll을 사용하여 파일의 상단과 끝에 몇 줄을 추가하고 싶습니다 awk
.
예: 내 awk
명령:
awk 'BEGIN { print "line1\nline2" } { print $0 } END { print "line3\nline4" }' file |tee file
line1
위 명령을 사용하면 상단 & 끝에 &를 추가할 수 있습니다 .line2
line3
line4
file
이제 현재 디렉터리에 있는 모든 파일에 대해 동일한 작업을 수행하고 싶습니다.
내가 사용하는 경우:
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
awk
GNU 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