Thiết lập cho các ví dụ về sed
Đây là hướng dẫn nhanh để thiết lập ví dụ này, tôi sẽ cố gắng không tạo quá mức cần thiết.
từlà một tệp văn bản chứa các số từ 1 đến 100. Nếu bạn không chắc chắn về lệnh để tạo nó, hãy xem Hàm xuất cho xargs trong Lệnh xuất Bash. Bạn không bao giờ biết nó có thể có trong cuộc phỏng vấn kịch bản shell tiếp theo của bạn.
quán balà một tệp văn bản chứa một dòng -.
old-phplà một tệp văn bản chứa các dòng PHP cũ sẽ bị hỏng trong php7 trở lên. (Gợi ý: ereg)
Lưu ý rằng tất cả các chức năng được mô tả ở trên có thể được tìm thấy bên dưới trong Endnote về các chức năng để thiết lập.
Ví dụ về Sed với các lệnh tương đương
Trong môi trường dòng lệnh, bạn sẽ thấy có nhiều giải pháp cho một nhiệm vụ nhất định. Tuy nhiên, phần lớn, bạn muốn đi theo con đường mang lại ít kháng cự nhất. Dưới đây là danh sách các ví dụ về lệnh sed với các lệnh tương đương tương ứng, trong đó một số lệnh sẽ được trình bày chi tiết bên dưới.
1. In một dòng ngẫu nhiên (tương đương với sắp xếp -R - | đầu -1)
quyến rũ -n '$ ((NGẪU NHIÊN% 100))P'-2. In dòng cuối cùng trong tệp (tương đương với đầu -1 -)
quyến rũ -n '$ p'-3. In 10 dòng đầu tiên trong một tệp (tương đương với head -n 10 -)
quyến rũ '10q'-4. In dòng đầu tiên trong tệp (tương đương với đuôi -1 -)
quyến rũ -n '1p'-5. Xóa tất cả các trường hợp của một ký tự (tương đương với tr –delete ‘0’ -, trong đó 0 là ký tự mà chúng ta muốn xóa)
quyến rũ -Và 's / 0 // g'-6. Chuyển đổi tệp csv thành tsv (tương đương với tr ‘,’ ‘ t’ -)
quyến rũ -Và 's /, / t / g'-7.Gửi dòng vào tệp (tương đương với cat bar -)
quyến rũ '$ a ---'-8. Thêm dòng vào tệp (tương đương với cat - bar)
quyến rũ '1i ---'-9. In tất cả các dòng trong tệp (tương đương với cat -)
quyến rũ -n -Và 'P'-10. In các dòng khớp với một mẫu (tương đương với grep -e ‘^ 1’ -)
quyến rũ -n -Và '/ ^ 1 / p'-11. Xóa các dòng khớp với một mẫu (tương đương với grep -v -e ‘^ 1’ -)
quyến rũ -Và '/ ^ 1 / d'-12. Lấy số dòng trong một tệp (tương đương với wc -l -)
quyến rũ -n -Và '$ ='-13. Ghi vào một tệp ở chế độ nền (tee lệnh tương đương)
quyến rũ 'trong$ {1}'-Ví dụ sử dụng sed để triển khai lệnh tee
Ngay phía trên, có một ví dụ có nhãn Ghi vào tệp ở chế độ nền. Loại âm thanh giống như lệnh phát bóng. Vâng, nó là. Ở đây chúng tôi sẽ mở rộng về cách triển khai một hàm để thay thế tee trong bash bằng cách sử dụng sed.
Lệnh
tee (){
kiểm tra $ {#} -eq 1 || trở lại;
quyến rũ 'trong$ {1}'-
}
chủ chốt()
teecái này;
con mèocái này
chủ chốt
Đầu ra
12
3
4
5
6
7
số 8
9
10
1
2
3
4
5
6
7
số 8
9
10
Ở đây bạn sẽ thấy hai danh sách các số nguyên từ 1 đến 10. Đầu tiên là từ lệnh seq. Thứ hai chúng tôi nhận được từ con mèo của tệp được viết bằng chữ tee. Tôi biết nó là vô lý nhưng nó hoạt động!
Ví dụ sử dụng sed để in ra một dòng ngẫu nhiên trong tệp
Giả sử rằng chúng ta muốn in ra một dòng ngẫu nhiên trong tệp bằng cách sử dụng bash và một chút sed. Chúng ta có thể làm được không? Có, chúng tôi có thể! Đây là cách thực hiện.
Triển khai một chức năng
- Nhận số dòng trong một tệp, L
- Tạo một số ngẫu nhiên từ 1 đến L, R
- In R
Hàm mong đợi đầu vào được chuyển từ bên ngoài.
Lệnh
một số dòng(){
hàm sốlc()
{
quyến rũ -n -Và '$ ='-
};
hàm sốdòng in()
{
quyến rũ -n -Và '$ {1}P'-
};
nhân viên bán thời gian= $( mktemp );
con mèo-> $ {temp};
con mèo $ {temp} |dòng in $((NGẪU NHIÊN%$( con mèo $ {temp} |lc)+1 ));
rm $ {temp}
}
Cách sử dụng ví dụ (1)
seq 100 |_Đầu ra (1)
35Ví dụ sử dụng (2)
cuộn tròn https://linuxhint.com/bash_cut_command/ --im lặng |thẻ dải|một số dòngXem ví dụ bên dưới, sử dụng sed để tách các thẻ HTML. Lưu ý rằng ví dụ over đôi khi trả về giá trị trống cho các dòng trống. Như một bài tập, nó có thể được cải thiện.
Sử dụng sed để in các dòng trong tệp
Giả sử rằng bạn muốn triển khai một hàm trong bash để in ra một dòng nhất định trong một tệp. Cố gắng in một dòng duy nhất trong tệp bằng cách sử dụng vòng lặp trong bash, head, tail hoặc awk là quá nhiều công việc để in ra các dòng trong tệp. Điều tốt là chúng tôi có sed. Hàm kết quả bằng cách sử dụng sed sẽ như sau.
Lệnh
dòng in(){
quyến rũ -n '$ {1}P'-
}
Bây giờ, hãy xem điều gì sẽ xảy ra khi chúng ta sử dụng dòng chữ in trên các từ.
Lệnh
từ|dòng innăm mươiĐầu ra
năm mươiĐược chứ. Trông đẹp nhưng chúng ta hãy thử một cái gì đó trông ít tầm thường hơn một chút.
Lệnh
tuyên bố -xftừtuyên bố -xfdòng in
seq 1 10$(từ| wc -NS ) | xargs-tôibấu víu -NS 'từ | dòng in {} '
Đầu ra
1mười một
hai mươi mốt
31
41
51
61
71
81
91
Được chứ. Bây giờ điều đó giống hơn! Bạn thấy cách sed có thể được sử dụng trong tập lệnh bash để in ra bất kỳ dòng nào trong tệp.
Ví dụ về Sed không có lệnh tương đương
Trong môi trường dòng lệnh, đôi khi con đường dẫn đến một giải pháp mang lại ít kháng cự nhất là con đường sed; nếu không, bạn sẽ phải làm nhiều việc hơn yêu cầu ngay từ đầu. Một số lệnh có thể được giới thiệu dưới đây.
Ra lệnh cho tất cả các dòng trong một tập lệnh shell
quyến rũ -Và 's / ^ / # /'-Xóa dòng đầu tiên
quyến rũ -Và '1ngày'-
Xóa bỏCuối cùnghàng
quyến rũ -Và '$ d'-
Chèn một dòng trước các dòng khớp với một mẫu
quyến rũ '/ 0 $ / tôi ---'-
Chèn một dòng sau các dòng khớp với một mẫu
quyến rũ '/ 0 $ / ---'-
Loại bỏ các thẻ html
quyến rũ -Và 's /†*.// g'-
Nâng cấp eregtrongmã php cũ để chạytrongphp7 trở lên
quyến rũ 's / ereg ( ([^,] * ). ([^)] * ) ./ strpos ( 2, 1) / g'
Đánh dấunếu như quyến rũsớm hơn một phiên bản nhất định
quyến rũ -Và 'v 4,5'-
Ví dụ phiên bản sed phân nhánh trong bash
Ở trên trong các ví dụ, có một dòng để Kiểm tra xem sed có sớm hơn một phiên bản nhất định mà chúng ta có thể sử dụng để triển khai phân nhánh phiên bản trong bash hay không, điều này tôi tin là dễ dàng hơn so với việc cố gắng triển khai một hàm để so sánh số phiên bản từ đầu ra sed –version . Cạm bẫy duy nhất đó là nếu có phiên bản sed cũ hơn không hỗ trợ lệnh v, thì chúng tôi sẽ gặp rắc rối.
Lệnh
test-sed-version-at-most() {quăng đi -n | quyến rũ 'v$ {1}'-2> /nhà phát triển/vô giá trị
}
phiên bản thử()
{
quăng đi -n 'Phiên bản$ {1}. Được chứ. Làm điều đó;
test-sed-version-at-most$ {1} && {
quăng đi -n 'cũ';
thật
} || {
quăng đi -n 'Mới'
};
quăng đi ' đường.'
}
chủ chốt()
{
địa phươngv;
vìvtrong 4.{4,5};
làm
phiên bản thử$ {v};
xong
}
chủ chốt
Đầu ra
Phiên bản4.4. Được chứ. Làm theo cách cũ.Phiên bản4,5. Được chứ. Làm theo cách mới.
Lưu ý rằng phiên bản sed đang chạy trên máy của tôi khi nhập các ký tự này là 4.4, điều này sẽ giải thích kết quả đầu ra ở trên. Đồng thời, phiên bản mới nhất của gnu sed là 4.7, cũ hơn phiên bản tôi có khoảng 3 năm. Sed của tôi đã cũ! Trên thực tế, trong sed 4.0.6, một tham số đã được thêm vào lệnh phiên bản để chiến lược này hoạt động đối với bất kỳ phiên bản nào đã nói ít nhất là v4.0.6, điều này khá dễ chịu khi xem xét phiên bản đó được phát hành vào đầu năm 2003. Bạn thật tốt.
Tôi đã thực hiện thêm một số thao tác đào, thực sự là TIN TỨC đọc ra mã nguồn mới nhất. Phiên bản 4.6 có một tính năng mới, –debug kết xuất tập lệnh và chú thích các dòng đầu ra. Điều này sẽ cho phép bạn dịch các tập lệnh sed được tạo bởi các hàm ở dạng bash sang dạng chuẩn. Mát mẻ! Đừng quên rằng bạn cần phân nhánh phiên bản sed trong bash. Đó là nơi mà ví dụ về sed này phát huy tác dụng.
Ví dụ về hàm bash sử dụng sed để tách các thẻ HTML
Trong các ví dụ trên, có một dòng để Tách thẻ HTML. Hãy chuyển điều đó vào một hàm bash và sử dụng nó để loại bỏ tất cả các thẻ HTML khỏi bài viết cuối cùng tôi đã viết.
Lệnh
thẻ dải(){
quyến rũ -Và 's /†*.// g'-
}
cuộn tròn https://linuxhint.com/bash_cut_command/ --im lặng |thẻ dải
Tôi không thể nói rằng nó hoàn hảo nhưng ít nhất nó có thể đọc được trong thiết bị đầu cuối.
Ví dụ về quy trình làm việc với quy trình làm việc: Quy trình làm việc mẫu: thay thế an toàn tất cả bằng cách sử dụng find, grep và sed
Có thể nói rằng những thay đổi được thực hiện bằng cách sử dụng sed với tùy chọn -i là không thể thay đổi được. Đó là trừ khi bạn hoàn toàn chắc chắn về văn bản nào sẽ được thay thế, bạn có khả năng kết thúc với một ký tự ít hơn dự định. Đó là lý do tại sao trong ví dụ này, chúng tôi sẽ sử dụng sed trong quy trình làm việc để thay thế văn bản một cách an toàn trong tất cả các tệp bạn đã chọn.
Quy trình làm việc
- tìm thấy
- nắm chặt
- quyến rũ
tìm thấy
Tại đây, bạn sẽ chọn các tập tin để thay thế. Tôi khuyên bạn nên sử dụng một lệnh dọc theo các dòng sau:
tìm thấy -kiểuNS-Tên | nắm chặt -v-Và| xargs-tôi ...Ví dụ: bạn có thể muốn giới hạn các tệp để thay thế các tệp PHP ngoại trừ các thư mục kho lưu trữ git như sau.
tìm thấy -kiểuNS-Tên*.php| nắm chặt -v -Và '.đi' | xargs -tôi...Đọc thêm về lệnh xargs trong bash.
nắm chặt
Tiếp theo, chúng ta sẽ thử đối sánh some_pattern trong các tệp được chọn như sau. Lưu ý rằng vì chúng tôi đang sử dụng tùy chọn -o cho grep, đầu ra sẽ chỉ hiển thị chuỗi phù hợp nếu có.
tìm thấy -kiểuNS-Tên*.php| nắm chặt -v -Và '.đi' |xargs -tôi nắm chặt -Vàsome_pattern-hoặc
Lệnh trên sẽ trả về một danh sách các chuỗi khớp với some_pattern.
quyến rũ
Cuối cùng, chúng tôi muốn thay thế tất cả chuỗi khớp với some_pattern. Để làm điều đó, chúng ta cần chuyển đổi grep thành sed như sau.
tìm thấy -kiểuNS-Tên*.php| nắm chặt -v -Và '.đi' |xargs -tôi quyến rũ -tôi -VàNS/some_pattern/thay thế/NS
Lệnh grep trở thành sed -i và tùy chọn -o bị loại bỏ. Và bạn có nó rồi đấy!
Bây giờ bạn có thể kiểm tra trước những dây nào sẽ được thay thế trong sed thay vì kiểm tra vận may của bạn.
Chú thích về các tùy chọn được sử dụng trong các ví dụ
Dưới đây là danh sách các tùy chọn được sử dụng trong các ví dụ sed được thảo luận ngắn gọn.
Lựa chọn | Sự miêu tả |
-tôi | Chỉnh sửa tại chỗ. Nếu đầu vào là một tệp (không được đưa vào) thì kết quả của các biểu thức sẽ ghi đè lên nội dung của tệp. Sed chấp nhận một ví dụ) sed -n… |
-Và | -e là viết tắt của biểu thức. Tham số của nó là một biểu thức trong ngôn ngữ sed. Sed chấp nhận nhiều ví dụ) sed -e'expr1 '-e'expr2'
|
-n | Ẩn dòng không bị ảnh hưởng bởi biểu thức. Đó là nếu biểu thức là một câu lệnh in trong ngôn ngữ sed, thì các dòng không có trong câu lệnh in sẽ không được đưa vào đầu ra. ví dụ) sed -n…
|
Để biết thêm về các tùy chọn sed có sẵn, hãy xem sed –help
Ghi chú cuối về các lệnh tương đương sử dụng trong các ví dụ
Các tiện ích dòng lệnh sau được bao gồm trong các ví dụ sed với các lệnh tương đương.
- loại
- cái đầu
- đuôi
- nắm chặt
- con mèo
- Tr
- tee
Chú thích ở cuối - trong ví dụ các lệnh tương đương
Trong trường hợp bạn đang tự hỏi điều gì đang xảy ra với ký tự - trong ví dụ, ghi chú này là dành cho bạn. Tôi đã thêm một ký tự - sau hầu hết các lệnh trong các ví dụ để gợi ý rằng chúng tôi mong đợi dữ liệu đầu vào được nhận qua một đường ống. Đó là,
con mèomột số tập tin| loại -NS-| cái đầu -1Tuy nhiên, khi có lệnh ở bên trái đường ống, chúng ta có thể bỏ qua gợi ý như sau.
con mèomột số tập tin| loại -NS | cái đầu -1Đó là những gì đã xảy ra với - ký tự sau các lệnh trong các ví dụ.
Chú thích về các chức năng để thiết lập
Trong trường hợp bạn đang tìm kiếm, đây là các chức năng để thiết lập cho các ví dụ trên. Kết quả thu được bằng cách sử dụng khai báo -f. Đọc thêm về lệnh khai báo trong bash để biết thêm cách sử dụng.
Lệnh
từ(){
seq 100
}
quán ba()
{
quăng đi ---
}
old-php()
{
quăng đi 'ereg ($ UA,' Bottybot ')'
}
Điểm mấu chốt
Tôi rất thích viết các ví dụ về Bash sed và thậm chí có thêm một vài thủ thuật trong quá trình thực hiện. Sed là một tiện ích dòng lệnh mạnh mẽ và ngôn ngữ biểu đạt để thao tác các tệp văn bản. Nếu bạn thích tìm hiểu về sed, đừng lo lắng vẫn còn rất nhiều điều cần được tiếp xúc. Tiếp tục đi.