2011-07-31 31 views
7

Tôi đã thực hiện một số thực hành với lệnh Unix sed. Tôi đã cố gắng ra lệnh thay thế và nối thêm, trong một tập tin. Nhưng khó khăn là, tôi phải tạo một tập tin trung gian, và sau đó làm mv để đổi tên nó thành tệp gốc.Làm thế nào để thay thế mà không tạo tập tin trung gian trong sed?

Có cách nào để thực hiện điều đó tại một ảnh trong cùng một tệp không?

[[email protected] practice]# sed '1i\ 
> Today is Sunday 
> ' file1 > file1 

[[email protected] practice]# cat file1 
[[email protected] practice]# 

Tệp bị xóa!

[[email protected] practice]# sed 's/director/painter/' file1 > file1 
[[email protected] practice]# cat file1 

Tệp bị xóa!

+1

Bất kỳ ai cũng bỏ phiếu cho câu hỏi của tôi? Nhưng tại sao? – kingsmasher1

Trả lời

11

GNU sed biết tùy chọn -itại chỗ chỉnh sửa các tệp đã cho.

Khi làm phẫu thuật file1 > file1 những gì thực sự xảy ra là, rằng tập tin là mởcắt ngắn bằng vỏ trước chương trình (mà được tên của nó như là đối số) đi kèm xung quanh đọc bất cứ điều gì từ nó.

Cập nhật:

sed của người đàn ông trang tiểu bang sau đây vào tùy chọn -i (nhờ Delan đề cập đến nó):

-i[SUFFIX], --in-place[=SUFFIX] 

      edit files in place (makes backup if extension supplied) 
+0

Thật sao? Bạn có nghĩa là sử dụng tùy chọn -i tôi có thể thay thế và nối thêm vào cùng một tập tin? Hãy để tôi thử. – kingsmasher1

+2

Hãy đảm bảo tránh nhóm các đối số tùy chọn khác sau '-i'. Tôi thường sử dụng 'sed -i -r' để làm một sed tại chỗ với ERE, nhưng không thể sử dụng' sed -ir' vì điều đó sẽ tạo một bản sao lưu, kết hợp 'r' vào các tệp sao lưu. –

+0

* tại chỗ * như trong, chỉnh sửa các dòng phù hợp, để người khác một mình. * KHÔNG * nối thêm. –

1

sed -i.bak 's/giám đốc/painter/'file1

-i[SUFFIX], --in-place[=SUFFIX] 

    edit files in place (makes backup if extension supplied) 
+0

Cảm ơn bạn, vâng tôi đã thử nó hoạt động. Nhưng đầu ra bàn điều khiển bị chặn. Upvote cho bạn và Fritschy :) – kingsmasher1

11

Hãy thử điều này -

sed -i '' 's/originaltext/replacementtext/g' filename | cat filename 

-i '' có nghĩa là cung cấp tệp sao lưu. Nếu bạn tin rằng sự thay thế của mình sẽ không gây ra sự cố, bạn có thể đặt '' để không chuyển tệp sao lưu

/g để thay thế toàn cầu. Nếu bạn có nhiều hơn một văn bản gốc trong một dòng thì tùy chọn/g sẽ thay thế tất cả những thứ khác, nó sẽ chỉ thay thế đầu tiên.

+0

Sử dụng 'sed -i''' mà không có một không gian làm việc cho tôi trên gitbash – cjsimon

+0

'sed -i' '' (với một không gian) sẽ làm việc với BSD sed, nhưng chỉ có' sed -i ' ''(không có khoảng trống) sẽ hoạt động với GNU sed. Khá bực bội thực sự. –

Các vấn đề liên quan