GNU awk
(thường được tìm thấy trên các hệ thống Linux), kể từ phiên bản 4.1.0, có thể bao gồm một " awk
thư viện nguồn" có -i
hoặc --include
trên dòng lệnh. Một trong những thư viện nguồn được phân phối với GNU awk
là một trong những thư viện được gọi là inplace
:
$ cat file
hello
there
$ awk -i inplace '/hello/ { print "oh,", $0 }' file
$ cat file
oh, hello
Như bạn có thể thấy, điều này làm cho đầu ra của awk
mã thay thế tệp đầu vào. Dòng nói there
không được giữ vì nó không được chương trình xuất ra.
Với một awk
tập lệnh trong một tập tin, bạn sẽ sử dụng nó như
awk -i inplace -f script.awk datafile
Nếu awk
biến INPLACE_SUFFIX
được đặt thành một chuỗi, thì thư viện sẽ tạo một bản sao lưu của tệp gốc với đó là hậu tố tên tệp.
awk -i inplace -v INPLACE_SUFFIX=.bak -f script.awk datafile
Nếu bạn có một vài tệp đầu vào, thì mỗi tệp sẽ được chỉnh sửa tại chỗ. Nhưng bạn có thể tắt chỉnh sửa tại chỗ cho một tệp (hoặc một bộ tệp) bằng cách sử dụng inplace=0
trên dòng lệnh trước tệp đó:
awk -i inplace -f script.awk file1 file2 inplace=0 file3 inplace=1 file4
Trong lệnh trên, file3
sẽ không được chỉnh sửa tại chỗ.
Để "chỉnh sửa tại chỗ" di động hơn cho một tệp, hãy sử dụng
tmpfile=$(mktemp)
cp file "$tmpfile" &&
awk '...some program here...' "$tmpfile" >file
rm "$tmpfile"
Điều này sẽ sao chép tệp đầu vào vào một vị trí tạm thời, sau đó áp dụng awk
mã trên tệp tạm thời trong khi chuyển hướng đến tên tệp gốc.
Thực hiện các thao tác theo thứ tự này (chạy awk
trên tệp tạm thời, không phải trên tệp gốc) đảm bảo rằng siêu dữ liệu tệp (quyền và quyền sở hữu) của tệp gốc không bị sửa đổi.