Ví dụ về Bash Sed

Bash Sed Examples



Bash cho phép bạn thực hiện thay thế mẫu bằng cách sử dụng mở rộng biến như ($ {var / pattern / Replace}). Và như vậy, sed có giống như thế này không (sed -e ‘s / pattern / Replace /’). Tuy nhiên, có nhiều điều để quyến rũ hơn là thay thế các mẫu trong tệp văn bản. Ở đây, chúng ta sẽ khám phá lại sed, ví dụ, với các lệnh và quy trình công việc tương đương để hỗ trợ các công việc hàng ngày.

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

1
2
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

  1. Nhận số dòng trong một tệp, L
  2. Tạo một số ngẫu nhiên từ 1 đến L, R
  3. 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)

35

Ví 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òng

Xem 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

1
mườ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;
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

  1. tìm thấy
  2. nắm chặt
  3. 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 -1

Tuy 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.