Score:0

คำสั่ง echo แบ่งบรรทัด ใช้ในลูป

ธง br

ในไฟล์ของฉัน 'foo' มีบรรทัดแรก: 'a b' และบรรทัดที่สอง: 'c d':

$แมวฟู
ก ข 
ซีดี

ฉันต้องการพิมพ์ในเทอร์มินัลในลูปสองบรรทัดนี้: ทีละบรรทัด:

$ สำหรับฉันใน $ (cat foo); ทำ echo $i; เสร็จแล้ว

แต่ในคำสั่งเอาต์พุต 'echo' จะแบ่งคำสั่ง ดังนั้นแทนที่จะมี:

ก ข
ซีดี

ที่จริงฉันมี:

ก
ข
ค
ง
pLumo avatar
in flag
`for i in $(cat foo)` ไม่วนบรรทัด แต่แยกคำโดยตัวคั่นฟิลด์ของคุณ (`IFS`)
br flag
ฉันจะวนบรรทัด / เปลี่ยนโหมด IFS เป็นลูปบรรทัดไม่ใช่คำได้อย่างไร
pLumo avatar
in flag
หากคุณบอกเราว่าคุณต้องการทำอะไรจริง ๆ เราสามารถช่วยคุณทำได้อย่างถูกต้องโดยใช้ `sed` หรือมากกว่านั้น
Score:4
ธง in

สำหรับฉันใน $(cat foo) ไม่วนซ้ำบรรทัด แต่แยกคำ (หรือฟิลด์) โดยของคุณ ตัวคั่นฟิลด์ $ไอเอฟเอส. เป็นค่าเริ่มต้นที่ \n\t (เว้นวรรค ขึ้นบรรทัดใหม่ แท็บ)

หากคุณเปลี่ยนตัวคั่นฟิลด์ให้ขึ้นบรรทัดใหม่เท่านั้น คุณสามารถใช้คำสั่งตามที่เป็น (ข้อจำกัดความรับผิดชอบ: โปรดอ่านด้านล่าง!):

ไอเอฟเอส=$'\n'
สำหรับฉันใน $(cat foo); ทำ echo $i; เสร็จแล้ว

คุณอาจต้องการสำรองข้อมูลของ IFS เพื่อกู้คืนในภายหลัง:

OLD_IFS="$IFS"
.
.
.
IFS="$OLD_IFS"

เอาท์พุต:

ก ข
ซีดี

อย่างไรก็ตามถือว่า แย่ ฝึกฝน.

  • บิตดีกว่า: ในขณะที่ IFS= อ่าน -r บรรทัด; ทำ ... เสร็จแล้ว <ไฟล์
  • ดีกว่ามาก: ใช้เครื่องมือเฉพาะสำหรับงานของคุณ เช่น เกรป, เสด หรือ อึดอัด.

กรุณาอ่าน เหตุใดการใช้เชลล์ลูปเพื่อประมวลผลข้อความจึงถือเป็นการปฏิบัติที่ไม่ดี.

br flag
ฉันจะใช้ 'grep' แทนได้อย่างไร
pLumo avatar
in flag
เราไม่สามารถรู้ได้ เพราะเราไม่รู้ว่าคุณต้องการทำอะไร ดูความคิดเห็นล่าสุดของฉันเกี่ยวกับคำถามของคุณ
Score:2
ธง ph

คุณสามารถใช้ได้ ในขณะที่อ่าน เพื่อจุดประสงค์นี้

[/tmp]$ ในขณะที่อ่านบรรทัด ; ทำ echo $line ; เสร็จแล้ว < ฟู                                     
ก ข
ซีดี

เพิ่มตัวคั่นเพื่อความเข้าใจของคุณ

[/tmp]$ ในขณะที่อ่านบรรทัด ; ทำ echo $line ; เสียงสะท้อน "----" ; เสร็จแล้ว < ฟู                       
ก ข
----
ซีดี
----
[/tmp]$    
br flag
ถ้าฉันต้องการใช้วิธีแก้ปัญหาของคุณ แต่ยังเพิ่มคำสั่งแบบมีเงื่อนไขภายใน for ของฉันด้วย แล้ว "$i" จะเป็นอย่างไร ฉันหมายถึงสิ่งนี้: for i in $( while read line ; do echo $line ; done
hr flag
โปรดทราบว่าควรอ้าง `$line` `"$line"` ด้วยเหตุผลที่คล้ายคลึงกัน (ไม่เช่นนั้นจะเป็นการแยกคำออกเป็นโทเค็นแยกกัน - ลองใช้ `a b` แทน `a b` เป็นต้น)
hr flag
... เช่นกัน `read` จะยังคงลบช่องว่างนำหน้าและขยายลำดับการหลีกตามค่าเริ่มต้น ดังนั้นโดยทั่วไปแล้ว ถ้าคุณต้องการ echo บรรทัด *ตรง* คุณต้องการ ` while IFS= read -r line; ทำ ...` หรือ (เพื่อรวมบรรทัดสุดท้ายที่สิ้นสุดอย่างไม่ถูกต้อง) ` while IFS= read -r line || [[ -n "$บรรทัด" ]]; ทำ ...`
bac0n avatar
cn flag
@JosefKlimuk ``` ในขณะที่อ่าน -r; ทำถ้า ! grep -oe 'a'

โพสต์คำตอบ

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