Điểm:1

Các biến để xây dựng các mẫu để sử dụng với sed

lá cờ jp

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## # 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-
}
Điểm:1
lá cờ cn

Tôi thực sự sẽ sử dụng một cái gì đó phức tạp hơn cho việc này. Giống như awk:

$ awk -v start="$begsec" -v end="$endsec" \
    '{ 
        if($0~start){want=1; tiếp theo} 
        if($0~end){want=0; in ""; tiếp theo} 
        gsub(/\s*#+\s*/,""); 
     } muốn' tập tin
* 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.

Hoặc, sử dụng chức năng cuối cùng của bạn ở đó làm mẫu:

chụp-rec ()
{

  local begsec='## mode: org'
  local endsec='## # Kết thúc tổ chức'

  awk -v start="$begsec" -v end="$endsec" \
    '{ 
        if($0~start){want=1; tiếp theo} 
        if($0~end){want=0; in ""; tiếp theo} 
        gsub(/\s*#+\s*/,""); 
     } muốn' "$1"
}

Một báo trước có thể quan trọng là điều này không yêu cầu rằng $begsec$endsec là những thứ duy nhất trên dòng ngoài khoảng trắng ở đầu như cách tiếp cận của bạn đã làm, nó chỉ đơn giản là tìm kiếm chúng ở bất kỳ đâu trên dòng. Tôi cho rằng đây không phải là vấn đề lớn khi xem xét những gì bạn đang tìm kiếm, nhưng nếu đúng như vậy, bạn có thể sử dụng cái này thay vào đó sẽ xóa khoảng trắng ở đầu và cuối dòng trước khi khớp:

chụp-rec ()
{

  local begsec='## mode: org'
  local endsec='## # Kết thúc tổ chức'

    awk -v start="$begsec" -v end="$endsec" \
    '{ 
        sub(/^[[:dấu cách:]]*/,"");
        sub(/[[:dấu cách:]]*$/,"");
        if($0==start){ muốn=1; tiếp theo} 
        if($0==end){ muốn=0; in ""; tiếp theo} 
        gsub(/\s*#+\s*/,""); 
     } muốn' "$1"
}
lá cờ jp
Nó đang in các phần khác của tệp trước dòng khớp đầu tiên
lá cờ jp
Tôi cần chúng là những thứ duy nhất trên dòng ngoài khoảng trắng ở đầu, bởi vì chúng sẽ được chọn nếu tôi chạy các lệnh trên cùng một tệp (chọn `local begsec='## mode: org'` và `local endsec ='## # Kết thúc tổ chức'`).
terdon avatar
lá cờ cn
@Fatipati xem câu trả lời được cập nhật cho một phiên bản chỉ hoạt động trên các dòng trong đó beg- và endsec là toàn bộ dòng ngoại trừ khoảng trắng ở đầu và cuối. Nếu điều đó không hoạt động như mong đợi, vui lòng cho tôi xem tệp bị lỗi để tôi có thể hiểu tại sao.
Điểm:0
lá cờ cn

Dòng lệnh đơn này trong tập lệnh của bạn có thể thực hiện công việc:

awk '/## mode/{flag=1;next} /## # End/{flag=0} flag' extract.txt | tr -d /#/ | awk '$1=$1'

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

awk thứ hai chỉ đơn giản là loại bỏ các khoảng trắng ở đầu.

lá cờ jp
A đã đề cập, tôi nhận được nhiều dòng được in hơn giữa các phần `bắt đầu` và `kết thúc`. Điều này là do tôi đang chuyển cùng một tệp mà tôi có mã và do đó có chức năng `capture-org`.
lá cờ jp
Tôi cần khớp chính xác như với các mẫu `^[[:space:]]*## mode: org$` và `^[[:space:]]*## # End of org$`.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.