Tôi không thể tìm thấy bất kỳ tài liệu nào về công sed
-e
tắ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/'
Tôi không thể tìm thấy bất kỳ tài liệu nào về công sed
-e
tắ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/'
Câu trả lời:
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 -e
tù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ế foo
bằng bar
và sau đó xóa mọi dòng chứa FOO
.
-e
Đ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/d
và được nhóm bởi {...
} ví dụ: /foo/{h;d}
nhưng đối với các i,a,c
lệnh, nó -e
cung 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
-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"
must be terminated with a newline
cụ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à -e
gì?
-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.
Trong trợ giúp cho sed
bạn sẽ thấy rằng -e
cờ 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/'
và sed -e 's/foo/bar/'
là tương đương. Trong cả hai trường hợp s/foo/bar/
là 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à -e
là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ờ sed
diễn giải đầu tiên s/foo/bar
là 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 -e
cờ 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
man sed
?