2012-02-29 27 views
6

Im cố gắng buộc phải thay người của một dòng duy nhất trong một tập tin với awk, ví dụthay đổi một dòng với awk

thay đổi này:

e1 is (on) 

e2 is (off) 

tới:

e1 is (on) 

e2 is (on) 

sử dụng lệnh:

awk '/e2/{gsub(/off/, "on")};{print}' ~/Documents/Prueba > ~/Documents/Prueba 

làm cho sự thay thế nhưng tập tin kết thúc trống!

Trả lời

18

câu trả lời khác, sử dụng một công cụ khác nhau (sed, và -i (tại chỗ) cờ)

sed -i '/e2/ s/off/on/' ~/Documents/Prueba 
17

Sự lúng túng của bạn là chính xác, tuy nhiên bạn đang chuyển hướng đến cùng một tệp với tài liệu gốc của bạn. Điều này khiến cho tệp gốc bị ghi đè trước khi nó được đọc. Bạn sẽ cần phải chuyển hướng đầu ra đến một tệp khác.

awk '/e2/{gsub(/off/, "on")};{print}' ~/Documents/Prueba > ~/Documents/Prueba.new 

Đổi tên Prueba.new sau đó nếu cần.

+2

+1. Nhấn mạnh vào "tập tin ban đầu [được] ghi đè * trước * nó đã được đọc" –

0

Bạn không thể chuyển hướng đến cùng một tệp như tệp đầu vào. Chọn tên tệp khác.

> sẽ trống bạn đặt ở vị trí đầu tiên.

2

Bạn cũng có thể sử dụng cat để đọc các tập tin đầu tiên, sau đó sử dụng pipe để chuyển hướng đến stdout, sau đó đọc với awk từ stdin:

cat ~/Documents/Prueba | awk '/e2/{gsub(/off/, "on")};{print}' - > ~/Documents/Prueba 

tôi tin rằng các dấu gạch ngang - là không bắt buộc, vì bạn chỉ đọc stdin.

Một số tài liệu thú vị: https://www.gnu.org/software/gawk/manual/html_node/Naming-Standard-Input.html

2

Theo giải thích của các câu trả lời khác và trong câu hỏi "Why reading and writing the same file through I/O redirection results in an empty file in Unix?", các chuyển hướng vỏ phá hủy tập tin đầu vào của bạn trước khi nó được đọc.

Để giải quyết sự cố đó mà không cần sử dụng một cách rõ ràng vào tệp tạm thời, hãy xem lệnh sponge từ bộ sưu tập moreutils.

awk '/e2/{gsub(/off/, "on")};{print}' ~/Documents/Prueba | sponge ~/Documents/Prueba 

Hoặc, nếu GNU awk được cài đặt trên hệ thống, bạn có thể sử dụng in place extension.

gawk -i inplace '/e2/{gsub(/off/, "on")};{print}' ~/Documents/Prueba 
Các vấn đề liên quan