Score:1

การส่งตัวแปรสคริปต์ทุบตีไปยัง sed

ธง vn

ผู้โพสต์ครั้งแรกที่นี่และฉันค้นหามาระยะหนึ่งแล้ว แต่ไม่พบเธรดที่ฉันเข้าใจได้ดีพอที่จะแก้ปัญหาของฉัน

ฉันมีลูปในสคริปต์ของฉันที่สร้างตัวแปรบางอย่างผ่านการคั่นด้วย cut -d และฉันต้องการใช้ตัวแปรนั้นเป็นอินพุตสำหรับ sed เพื่อแก้ไขไฟล์ที่แตกต่างกันในแต่ละการวนซ้ำ สคริปต์ปัจจุบันของฉันคือ:

สคริปต์ปัจจุบันของฉันมีลักษณะดังนี้:

สำหรับการป้อนข้อมูลใน $(tail -n 3 filea)
ทำ
        a="$(echo $input | ตัด -d "," -f 1)"
        b="$(echo $input | ตัด -d "," -f 2)"
        c="$(echo $input | ตัด -d "," -f 3)"

        เสียงสะท้อน $a
        เสียงสะท้อน $b
        เสียงสะท้อน $c

        หาง -n 1 fileb | sed 's,'$a','$c',2'
เสร็จแล้ว

ด้วยเอาต์พุตของ:

เค
26
ต
KTTXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
พี
27
อี
KKTXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
ส
31
พี
KKTXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

ตัวอย่างเช่น สตริงในตำแหน่ง 31 ควรแทนที่ด้วย S หากเป็น P

สถานะปัจจุบันของฉันคือฉันได้รับตัวแปร a และ c ถ่ายโอนไปยังคำสั่ง sed อย่างถูกต้องและสตริงที่เกี่ยวข้องจะถูกแทนที่ แต่เปลี่ยนเป็น sed 's,'$a','$c','$b'' หยุดการแทนที่ใด ๆ และบรรทัดเนทีฟ (สุดท้าย) ของ fileb จะได้รับพร้อมท์

ฉันรู้ว่าการถามคำถามที่ดีเป็นหัวข้ออื่นทั้งหมด แต่ฉันหวังว่าใครสักคนสามารถช่วยฉันให้เข้าใจการเขียนที่นี่ เพื่อที่ฉันจะได้สามารถเรียนรู้การเขียนโปรแกรมต่อไปได้ เนื่องจากฉันมักจะก้าวข้ามข้อผิดพลาดเช่นนี้

hesey avatar
vn flag
ฉันนับคำพูดได้ 8 ตัว ซึ่งเป็นเลขคู่ สุดท้ายจะเป็นใบเสนอราคาต่อท้ายได้อย่างไร
hr flag
อ๊ะ คุณพูดถูก ขอโทษ
hesey avatar
vn flag
คำพูดมากเกินไปแน่นอน :D แต่ยังไงก็ขอบคุณที่สนใจช่วยเหลือ!
Score:1
ธง cn

หมายเหตุ:

ที่ให้ไว้:

ไฟล์แมว $
K,26,ต
หน้า 27 อี
ส,31,ป

$ cat fileb
------------------------- เต้---พี---

แล้ว

หาง -n 3 ไฟล์ | ในขณะที่ IFS= ให้อ่าน -r อักขระตำแหน่งการแทนที่ ทำ
    printf -v regex '^(.{%d})%s' $((ตำแหน่ง - 1)) "$ character"
    printf -v repl '\1%s' "$replacement"

    เสียงสะท้อน "$regex"
    เสียงสะท้อน "$repl"

    หาง -n 1 ไฟล์b
    หาง -n 1 fileb | sed -E "s/$regex/$repl/"
เสร็จแล้ว

ผลลัพธ์:

^(.{25})ต
\1K
------------------------- เต้---พี---
------------------------- เคะ---พี---
^(.{26})จ
\1ป
------------------------- เต้---พี---
------------------------- TP---พี---
^(.{30})ป
\1ส
------------------------- เต้---พี---
------------------------- TE---เอส---

แต่นี่คือสิ่งที่ bash สามารถทำได้โดยไม่ต้องใช้ sed โดยใช้ ${var:offset:ความยาว} รูปแบบของ การขยายพารามิเตอร์:

หาง -n 3 ไฟล์ | ในขณะที่ IFS= ให้อ่าน -r อักขระตำแหน่งการแทนที่ ทำ
    echo "$replacement $ตำแหน่ง $ตัวอักษร"
    line=$(หาง -n 1 fileb)
    เสียงสะท้อน "$line"
    ถ้า [[ "${line:position - 1:1}" == "$ character" ]]; แล้ว
        line=${line:0:position - 1}${replacement}${line:position}
    ไฟ
    เสียงสะท้อน "$line"
เสร็จแล้ว

เอาต์พุต

เค 26 ต
------------------------- เต้---พี---
------------------------- เคะ---พี---
พี 27 อี
------------------------- เต้---พี---
------------------------- TP---พี---
ส 31 ป
------------------------- เต้---พี---
------------------------- TE---เอส---
hesey avatar
vn flag
น่าเสียดายที่ฉันทำผิดพลาดเล็กน้อยโดยพิมพ์ "แทนที่ด้วย S หากเป็น P" ทั้งที่ควรจะเป็น "แทนที่ด้วย P หากเป็น S" แต่ฉันเข้าใจแนวทางที่สองของคุณและเขียนใหม่ให้ฉัน ขอบคุณมาก ๆ!

โพสต์คำตอบ

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