แยกสายยาวบนตัวคั่น


21

ฉันสามารถใช้คำสั่งใดเพื่อแบ่งอินพุตเช่นนี้:

foo:bar:baz:quux

ลงในนี้

foo
bar
baz
quux

ฉันพยายามหาcutคำสั่ง แต่ดูเหมือนว่าจะใช้ได้เฉพาะกับอินพุตจำนวนคงที่เท่านั้นเช่น "ตัวอักษร 1,000 ตัวแรก" หรือ "เขตข้อมูลแรก 7" ฉันต้องทำงานกับอินพุตที่มีความยาวโดยพลการ


5
คุณหมายถึงtr : '\n' < inputอะไร
jw013

คุณใช้เปลือกอะไร ทุบตี?
glenn jackman

คำตอบ:


34

มีตัวเลือกน้อย:

  • tr : \\n
  • sed 's/:/\n/g'
  • awk '{ gsub(":", "\n") } 1'

คุณยังสามารถทำสิ่งนี้ได้ด้วยความบริสุทธิ์bash:

while IFS=: read -ra line; do
    printf '%s\n' "${line[@]}"
done

3
โปรดทราบว่าการใช้\nในสตริงการแทนที่เช่นนั้นจะทำงานใน GNU sed แต่จะล้มเหลวในการใช้งาน sed อื่น ๆ ส่วนใหญ่
wjv

@chrisdown มีวิธีที่จะทำให้ทั้งสองคนแรกที่ทำงานใน AIX?
cokedude


4

หาก grep ของคุณรองรับ-oคุณสามารถทำสิ่งนี้ได้:

grep -o '[^:]\+'

หรือด้วย awk ให้ตั้งค่าตัวคั่นเร็กคอร์ดเป็น::

awk -v RS=: 1

หรือด้วยการตัด GNU:

cut -d: --output-delimiter=$'\n' -f1-

แก้ไข

ดังที่ Chris ระบุไว้ด้านล่างสิ่งนี้จะทำให้เกิดบรรทัดใหม่ขึ้นมาซึ่งสามารถหลีกเลี่ยงได้หาก awk ของคุณรองรับการระบุRSเป็นนิพจน์ทั่วไป (ทดสอบด้วย GNU awk):

awk -v RS='[:\n]' 1

awkตัวอย่างของคุณจะขึ้นบรรทัดใหม่ (อาจเป็นที่ไม่พึงประสงค์) ขึ้นบรรทัดใหม่
Chris Down

@ChrisDown: ถูกต้องคุณสามารถหลีกเลี่ยงได้ถ้า RS เป็นนิพจน์ปกติ
ธ อร์

-1

ในบางสายฉันมีปัญหากับการแก้ปัญหาข้างต้น แต่นี่ใช้ได้สำหรับฉัน:

echo $string | sed 's/\\n/ /g' | tr " " \\n

ตามที่เขียนไว้นี้จะไม่แปลงอินพุตตัวอย่าง OP
kbulgrien
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.