2010-10-20 19 views
20

Tôi có một tập lệnh gọi grep để xử lý tệp văn bản. Hiện tại tôi đang làm một cái gì đó như thế này.Xử lý tại chỗ với grep

$ grep 'SomeRegEx' myfile.txt > myfile.txt.temp 
$ mv myfile.txt.temp myfile.txt 

Tôi đang tự hỏi nếu có cách nào để làm chế biến tại chỗ, như trong cửa hàng kết quả vào file gốc cùng mà không cần phải tạo ra một tập tin tạm thời và sau đó thay thế ban đầu với các tập tin tạm thời khi xử lý xong.

Tất nhiên tôi hoan nghênh ý kiến ​​về lý do tại sao điều này nên hoặc không nên được thực hiện, nhưng tôi chủ yếu quan tâm đến việc nó có thể được thực hiện hay không. Trong ví dụ này tôi đang sử dụng grep, nhưng tôi quan tâm đến các công cụ Unix nói chung. Cảm ơn!

Trả lời

12

Perl có -i switch, thì sedRuby

sed -i.bak -n '/SomeRegex/p' file 

ruby -i.bak -ne 'print if /SomeRegex/' file 

Nhưng lưu ý rằng tất cả những gì nó từng làm là tạo ra các tệp "tạm thời" ở phía sau mà bạn nghĩ rằng bạn không thấy, đó là tất cả.

cách khác, bên cạnh grep

awk

awk '/someRegex/' file > t && mv t file 

bash

while read -r line;do case "$line" in *someregex*) echo "$line";;esac;done <file > t && mv t file 
+0

như thế nào awk và bash ví dụ cải thiện trên grep gốc, khác hơn '&& 'thay vì' ; '? Những tệp này vẫn tạo một tệp tạm thời một cách rõ ràng. –

2

Không, nói chung nó không thể được thực hiện trong Unix như thế này. Bạn chỉ có thể tạo/cắt ngắn (bằng>) hoặc nối thêm vào một tệp (với >>). Sau khi cắt ngắn, nội dung cũ sẽ bị mất.

3

Nói chung, điều này không thể thực hiện được. Nhưng Perl có -i switch:

perl -i -ne 'print if /SomeRegEx/' myfile.txt 

Viết -i.bak sẽ gây ra các gốc được lưu trong myfile.txt.bak.

(Tất nhiên trong nội bộ, Perl chỉ làm cơ bản những gì bạn đã làm -. Không có phép thuật đặc biệt tham gia)

+2

nhận nó trong khi tôi đang tìm kiếm nó lên - 1 cho tốc độ của bạn –

0

Hầu hết các cài đặt của sed đều có thể thực hiện chỉnh sửa tại chỗ, kiểm tra trang người dùng, có thể bạn muốn cờ -i.

0

Để chỉnh sửa tập tin tại chỗ sử dụng vim chiều, hãy thử:

$ ex -s +'%!grep foo' -cxa myfile.txt 

Hoặc sử dụng sed hoặc gawk.

11

sponge (trong gói moreutils gói trong Debian/Ubuntu) đọc đầu vào cho đến EOF và ghi vào tệp, vì vậy bạn có thể grep tệp và ghi lại chính nó.

Như thế này:

grep 'pattern' file | sponge file