Score:1

ตัวแปรสำหรับสร้างรูปแบบเพื่อใช้กับ sed

ธง jp

ฉันได้เขียนฟังก์ชันทุบตีเพื่อพิมพ์ส่วนของข้อความที่ล้อมรอบระหว่างการจับคู่บรรทัด ## โหมด: org และ ## # จุดจบของ org ในไฟล์โดยมีบรรทัดว่างระหว่างส่วน ก่อนที่ ##, สามารถมีช่องว่างกี่ช่องก็ได้

นี่คือตัวอย่างไฟล์ที่จะดึงข้อมูลออกมา

ไฟล์: test.sh

## โหมด: org
## * ใช้คำสั่งกรณี
## # จุดจบของ org
กรณี $arg ใน
 ("วี")
   echo "ผู้แต่ง"
   ;;
 (*)
   ## โหมด: org
   ## ** โหมดการรายงานข้อผิดพลาดเงียบ (SERM) ใน getopts
   ## *** ตรวจหาคำเตือนโดยไม่ต้องพิมพ์ข้อความในตัว
   ## *** เปิดใช้งานโดยโคลอน {:} เป็นอักขระตัวแรกใน shortopts
   ## # จุดจบของ org
   หยุดพัก
   ;;
เอสแซค

ผลลัพธ์ที่ต้องการจะเป็น

รหัส:

* การใช้คำสั่งกรณี

** โหมดการรายงานข้อผิดพลาดเงียบ (SERM) ใน getopts
*** ตรวจพบคำเตือนโดยไม่ต้องพิมพ์ข้อความในตัว
*** เปิดใช้งานโดยโคลอน {:} เป็นอักขระตัวแรกใน shortopts

นี่คือฟังก์ชั่นที่ฉันใช้

จับภาพองค์กร ()
{
  efile ท้องถิ่น = "$1"

  โหมด begsec="## ท้องถิ่น: org"
  local endec="## # จุดสิ้นสุดขององค์กร"

  sed -n "/^[[:space:]]*${begsec}$/,/^[[:space:]]*${endsec}$/s/ *//p'" "$efile" |
   sed 's/^'"${begsec}"'$/\n'"${begsec}"'/' |
   sed '/^'"${begsec}"'$/d' | sed '/^'"${endsec}"'$/d' | ตัด -c 3-
}

ฉันต้องการทำให้ฟังก์ชันง่ายขึ้นโดยใช้ตัวแปรเพื่อสร้างรูปแบบ แต่ต้องการความช่วยเหลือในการรวบรวมคำสั่งเข้าด้วยกันโดยที่ฉันไม่ต้องเรียก เสด หลายครั้ง

บางทีอาจจะใช้ อึดอัด จะเป็นกลยุทธ์ที่ดีกว่า

จับภาพองค์กร ()
{
  efile ท้องถิ่น = "$1"

  local begsec='^[[:space:]]*## mode: org$'
  local endec='^[[:space:]]*## # จุดสิ้นสุดของ org$'

  sed -n "/${begsec}/,/${endsec}/s/ *//p" "$efile" |
   sed 's/^## # จุดสิ้นสุดของ org$/## # จุดสิ้นสุดของ org\n/' |
   sed '/^## โหมด: org$/d' | sed '/^## # จุดสิ้นสุดของ org$/d' | ตัด -c 3-
}
Score:1
ธง cn

ฉันจะใช้สิ่งที่ซับซ้อนกว่านี้สำหรับสิ่งนี้ ชอบ awk:

$awk -v start="$begsec" -v end="$endsec" \
    '{ 
        ถ้า ($0~เริ่ม){ต้องการ=1; ต่อไป} 
        ถ้า($0~จบ){ต้องการ=0; พิมพ์ ""; ต่อไป} 
        gsub(/\s*#+\s*/,""); 
     } ต้องการ' ไฟล์
* การใช้คำสั่งกรณี

** โหมดการรายงานข้อผิดพลาดเงียบ (SERM) ใน getopts
*** ตรวจพบคำเตือนโดยไม่ต้องพิมพ์ข้อความในตัว
*** เปิดใช้งานโดยโคลอน {:} เป็นอักขระตัวแรกใน shortopts

หรือใช้ฟังก์ชันสุดท้ายของคุณเป็นเทมเพลต:

จับบันทึก ()
{

  local begsec='## โหมด: org'
  local endec='## # จุดสิ้นสุดขององค์กร'

  awk -v start="$begsec" -v end="$endsec" \
    '{ 
        ถ้า ($0~เริ่ม){ต้องการ=1; ต่อไป} 
        ถ้า($0~จบ){ต้องการ=0; พิมพ์ ""; ต่อไป} 
        gsub(/\s*#+\s*/,""); 
     } ต้องการ' "$1"
}

ข้อแม้ประการหนึ่งที่อาจสำคัญคือสิ่งนี้ไม่จำเป็นต้องมี $ขอทาน และ $end วินาที เป็นสิ่งเดียวในบรรทัดนอกเหนือจากการเว้นวรรคนำหน้าเหมือนแนวทางของคุณ มันแค่ค้นหาพวกมันที่ใดก็ได้ในบรรทัด ฉันถือว่านี่ไม่ใช่เรื่องใหญ่อะไรเมื่อพิจารณาถึงสิ่งที่คุณกำลังมองหา แต่ถ้าใช่ คุณสามารถใช้สิ่งนี้แทนได้ ซึ่งจะลบช่องว่างที่จุดเริ่มต้นและจุดสิ้นสุดของบรรทัดก่อนที่จะจับคู่:

จับบันทึก ()
{

  local begsec='## โหมด: org'
  local endec='## # จุดสิ้นสุดขององค์กร'

    awk -v start="$begsec" -v end="$endsec" \
    '{ 
        ย่อย(/^[[:ช่องว่าง:]]*/,"");
        ย่อย(/[[:ช่องว่าง:]]*$/,"");
        ถ้า ($0==เริ่มต้น){ ต้องการ=1; ต่อไป} 
        ถ้า ($0==สิ้นสุด){ ต้องการ=0; พิมพ์ ""; ต่อไป} 
        gsub(/\s*#+\s*/,""); 
     } ต้องการ' "$1"
}
jp flag
กำลังพิมพ์ส่วนอื่นๆ ของไฟล์ก่อนหน้าบรรทัดแรกที่ตรงกัน
jp flag
ฉันต้องการให้เป็นสิ่งเดียวในบรรทัดนอกเหนือจากช่องว่างนำหน้า เพราะพวกเขาจะถูกเลือกถ้าฉันรันคำสั่งในไฟล์เดียวกัน (เลือกโหมด `local begsec='##: org'` และ `localendec ='## # จุดสิ้นสุดของ org'`).
terdon avatar
cn flag
@Fatipati ดูคำตอบที่อัปเดตสำหรับรุ่นที่ใช้งานได้เฉพาะในบรรทัดที่ beg- และ endec เป็นทั้งบรรทัดยกเว้นช่องว่างนำหน้าและต่อท้าย หากไม่ได้ผลตามที่คาดไว้ โปรดแสดงไฟล์ที่ล้มเหลวเพื่อให้ฉันเข้าใจสาเหตุ
Score:0
ธง cn

คำสั่งบรรทัดเดียวในสคริปต์ของคุณอาจทำงานได้:

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

* การใช้คำสั่งกรณี
** โหมดการรายงานข้อผิดพลาดเงียบ (SERM) ใน getopts
*** ตรวจพบคำเตือนโดยไม่ต้องพิมพ์ข้อความในตัว
*** เปิดใช้งานโดยโคลอน {:} เป็นอักขระตัวแรกใน shortopts

awk ตัวที่สองจะลบช่องว่างนำหน้าออก

jp flag
ตามที่กล่าวไว้ ฉันกำลังพิมพ์บรรทัดเพิ่มเติมระหว่างส่วน `begin` และ `end` นี่เป็นเพราะฉันกำลังส่งไฟล์เดียวกันกับที่ฉันมีรหัสและด้วยเหตุนี้ฟังก์ชัน `capture-org`
jp flag
ฉันต้องจับคู่ให้ตรงกับรูปแบบ `^[[:space:]]*## mode: org$` และ `^[[:space:]]*## # End of org$`

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา