sed: if then else

Chúng ta cần dò trong tập tin một từ khóa, tạm gọi là SEARCH, nếu tìm thấy thì thay bằng REPLACE, còn không thì thêm REPLACE vào cuối file. Tình huống tương tự vậy gặp nhiều trong thực tế và có các ứng dụng chuyên dùng như postconf với tập tin main.cf, nhưng postconf chậm nên chúng ta thử dùng sed.

sed '/SEARCH/{h;s/SEARCH/REPLACE/};${x;/^$/{s//REPLACE/;H};x}' -i file
  1. Đọc vào 1 dòng
  2. Tìm từ khóa SEARCH
  3. Nếu tìm thấy copy vào hold space (lệnh h). Ở pattern space thay thế SEARCH với REPLACE (lệnh s)
  4. Nếu đây là dòng cuối rồi ($), hoán đổi nội dung của hold space và pattern space (lệnh x). Nếu cho đến lúc này không tìm thấy SEARCH thì nội dung hold space trống gây nên pattern space trống. Thay thế nội dung trống bằng REPLACE (lệnh s) rồi nối vào hold space (lệnh H). Bấy giờ ở hold space là dòng cuối, dấu xuống dòng và REPLACE. Cuối cùng chúng ta hoán đổi nội dung của hold space và pattern space (lệnh x) để lấy về nội dung của hold space
  5. Hết dòng lệnh. In ra nội dung pattern space và quay trở lại 1.

Kết quả: Tất cả từ khóa SEARCH được thay bằng REPLACE. Nếu không tìm thấy SEARCH thì thêm REPLACE vào cuối file.

Áp dụng: Dòng lệnh tương đương với postconf -e “smtpd_tls_security_level = may”

sed '/smtpd_tls_security_level\s*=/{h;s/=.*/= may/};${x;/^$/{s//smtpd_tls_security_level = may/;H};x}' -i /etc/postfix/main.cf

Comments Off on sed: if then else

Filed under Software

Comments are closed.