Mục đích của -e trong lệnh sed là gì?


41

Tôi không thể tìm thấy bất kỳ tài liệu nào về công sed -etắc, để thay thế đơn giản, tôi có cần nó không?

ví dụ

sed 's/foo/bar/'

VS

sed -e 's/foo/bar/'

14
Bạn có chắc là bạn không tìm thấy thứ này trong man sed?

4
Bạn không tìm thấy lời giải thích về potongs, tại sao không sử dụng "cmd1; cmd2"
người dùng không xác định

Câu trả lời:


28

Từ trang người đàn ông:

-e script, --expression=script

    add the script to the commands to be executed

Vì vậy, bạn có thể sử dụng nhiều -etùy chọn để xây dựng một tập lệnh từ nhiều phần.

$ sed -e "s/foo/bar/" -e "/FOO/d"

Đầu tiên sẽ thay thế foobằng barvà sau đó xóa mọi dòng chứa FOO.


3
Vì vậy, bạn không cần '-e' nếu bạn chỉ có một tập lệnh, phải không?
JohnyTex

Tôi cũng vậy, tôi đang tìm kiếm mục đích thực sự của-e
typelogic

27

Điều này có thể làm việc cho bạn:

sed -e '/foo/i\' -e 'bar' -e '/fred/a\' -e 'barny' -e '/harry/c\' -e 'potter' file

Trong mỗi trường hợp, các lệnh i(insert), a(chắp thêm) và c(thay đổi) cần được chấm dứt bởi một dòng mới.

Thông thường các lệnh có thể được phân tách bằng một ;ví dụ /foo/d;/bar/dvà được nhóm bởi {...} ví dụ: /foo/{h;d}nhưng đối với các i,a,clệnh, nó -ecung cấp một cách để phân tách các lệnh.

Cách khác là sử dụng shell (bash) để chèn một dòng mới:

sed '/foo/i\bar'$'\n''/fred/a\barney'$'\n''/harry/c\potter' file

1
Trên ít nhất một số triển khai sed (ví dụ, trên FreeBSD), bạn cũng cần kết thúc nhãn và lệnh nhánh bằng cách sử dụng dòng mới / -e, thay vì bằng dấu chấm phẩy. Điều này sẽ không hoạt động : sed ':a; /x/ { s/x/y/g; ba }; q' <<< "jxm". Nhưng điều này sẽ:sed -e ':a' -e '/x/ { s/x/y/g; ba' -e '}; q' <<< "jxm"
dubiousjim

Tôi không chắc must be terminated with a newlinecụm từ này có nghĩa là cần thiết như thế nào . Khi tôi thử nghiệm ở đây cygwin, cái này hoạt động : sed '/foo/i\bar' file. Vì vậy, bây giờ chúng ta có thể hợp nhất các biểu thức riêng biệt thành một, điều này lại đặt ra câu hỏi ban đầu: mục đích thực sự của là -egì?
typelogic

1

-e, tương đương với --expression, là tùy chọn, trừ khi bạn kết hợp nhiều biểu thức với nhau (không phổ biến) như được hiển thị trong Câu trả lời khác .

Ngoài ra: ;có thể được sử dụng thay thế trong cùng một biểu thức để thực hiện một số biểu thức lần lượt.


0

Trong trợ giúp cho sedbạn sẽ thấy rằng -ecờ là viết tắt của:

 -e script, --expression=script
                 add the script to the commands to be executed

Nhưng bạn không phải là người đầu tiên bị nhầm lẫn sau khi gặp phải -e. Trong ví dụ của bạn sed 's/foo/bar/'sed -e 's/foo/bar/'là tương đương. Trong cả hai trường hợp s/foo/bar/tập lệnh được thực thi bởi sed. Tùy chọn thứ hai rõ ràng hơn, nhưng đó có lẽ không phải là lý do mà bạn thường thấy -eđược sử dụng. Lý do cho điều đó là -elàm cho nó có thể sử dụng nhiều hơn một tập lệnh với cùng một lời gọi sed. Điều đó vẫn để lại câu hỏi tại sao sử dụng nó nếu bạn chỉ sử dụng một tập lệnh? Ví dụ sau có thể giải thích rằng:

echo "foo" | sed -e 's/foo/bar/' -e 's/bar/foo'

Sẽ xuất "foo".

Tuy nhiên,

echo "foo" | sed 's/foo/bar/' -e 's/bar/foo'

sẽ thất bại vì bây giờ seddiễn giải đầu tiên s/foo/barlà một tên tệp. Do đó, để làm cho cuộc sống của bạn dễ dàng hơn trong tương lai, bạn đã có thể bắt đầu sử dụng -ecờ ngay hôm nay. Bằng cách đó, trong tương lai bạn chỉ có thể nối thêm lệnh với một tập lệnh bổ sung bằng cách sử dụng -e <script>.

NB Trong các câu trả lời khác sử dụng ;thay thế cho việc sử dụng nhiều tập lệnh đã được đề xuất. Mặc dù điều đó là có thể về mặt kỹ thuật trong một số trường hợp, nó không được khuyến khích, vì nó nhanh chóng dẫn đến việc đọc mã rất khó. Xem ví dụ tại đây: https://www.grymoire.com/Unix/Sed.html#uh-61

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.