Tôi đã viết một hàm bash để in các phần văn bản được đặt giữa các dòng phù hợp ## chế độ: tổ chức
và ## # Kết thúc tổ chức
trong một tệp, với một dòng trống giữa các phần. Trước ##
, có thể có bất kỳ số lượng không gian.
Dưới đây là một ví dụ về một tệp để trích xuất thông tin từ đó.
tập tin: test.sh
## chế độ: tổ chức
## * Sử dụng câu lệnh tình huống
## # Kết thúc tổ chức
trường hợp $arg trong
("v")
tiếng vang "Tác giả"
;;
(*)
## chế độ: tổ chức
## ** Chế độ báo cáo lỗi im lặng (SERM) trong getopts
## *** Phát hiện cảnh báo mà không cần in thông báo cài sẵn.
## *** Được kích hoạt bởi dấu hai chấm {:} làm ký tự đầu tiên trong shortopts.
## # Kết thúc tổ chức
nghỉ
;;
thoát hiểm
Đầu ra mong muốn sẽ là
Mã số:
* Sử dụng câu lệnh tình huống
** Chế độ báo cáo lỗi im lặng (SERM) trong getopts
*** Phát hiện cảnh báo mà không cần in thông báo cài sẵn.
*** Được bật bởi dấu hai chấm {:} làm ký tự đầu tiên trong shortopts.
Đây là chức năng tôi đang sử dụng
nắm bắt-org ()
{
địa phương efile="$1"
local begsec="## mode: org"
local endsec="## # Kết thúc tổ chức"
sed -n "/^[[:space:]]*${begsec}$/,/^[[:space:]]*${endsec}$/s/ *//p'" "$efile" |
sed 's/^'"${begsec}"'$/\n'"${begsec}"'/' |
sed '/^'"${begsec}"'$/d' | sed '/^'"${endsec}"'$/d' | cắt -c 3-
}
Tôi muốn đơn giản hóa chức năng, sử dụng các biến để xây dựng các mẫu. Nhưng cần một số trợ giúp để biên dịch các lệnh với nhau để tôi không phải gọi sed
rất nhiều lần.
Có lẽ sử dụng awk
sẽ là một chiến lược tốt hơn.
nắm bắt-org ()
{
địa phương efile="$1"
local begsec='^[[:space:]]*## mode: org$'
local endsec='^[[:space:]]*## # Kết thúc org$'
sed -n "/${begsec}/,/${endsec}/s/ *//p" "$efile" |
sed 's/^## # Kết thúc tổ chức$/## # Kết thúc tổ chức\n/' |
sed '/^## chế độ: org$/d' | sed '/^## # Kết thúc org$/d' | cắt -c 3-
}