Score:1

สตริง Bash แบ่งตามตัวคั่นที่จำกัดด้วยจำนวนอักขระ

ธง in

ฉันต้องการแยกข้อความยาว ๆ โดยคั่นด้วยช่องว่างผ่าน bash แต่ฉันทำไม่สำเร็จ คำสั่งด้านล่างแบ่งออกเป็นอักขระ แต่ไม่ใช่ตัวคั่น

echo "สุนัขจิ้งจอกเร็วกระโดดข้ามสุนัขขี้เกียจ" | พับ -w 10
echo "สุนัขจิ้งจอกเร็วกระโดดข้ามสุนัขขี้เกียจ" | sed -e 's/.\{9\}/&\n/g'

มันคงจะดีถ้ามีมันสำหรับการโต้ตอบกับผู้ใช้บางคน

ไวยากรณ์อินพุต

format_text 10 "สุนัขจิ้งจอกที่ว่องไวกระโดดข้ามสุนัขขี้เกียจ"

เอาท์พุต:

อย่างรวดเร็ว 
สุนัขจิ้งจอกกระโดด 
มากกว่า 
สุนัขขี้เกียจ

คุณต้องสังเกตว่าบรรทัดที่สามจะตัดตัวอักษร "l" จาก "ขี้เกียจ" ออกหากไม่ใช่สำหรับกฎการเว้นวรรค

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

#!/bin/bash

หัวพิมพ์ () {
    ประกาศ -i line_length=$3
    
    #รั้วบนและล่าง 
    คำสั่งบนท้องถิ่น = "พิมพ์ \"$1\" *" 
    โลคัล upper_fence="$(python -c "$upper_command $line_length")"
    
    local lower_command="พิมพ์ \"$2\" *"
    local lower_fence="$(python -c "$lower_command $line_length")"
    
    # Slice คำโดยเคาน์เตอร์ chracter
    regex_counter ท้องถิ่น = "s/(.{$line_length}) /\1\n/g"
    
    # เส้นที่สมบูรณ์ด้วยจุดและท่อ
    ความละเอียดในเครื่อง = "$line_length - ความยาว"
    โลคัล repeat_pattern='$(ซ้ำ res \".\"; echo)'
    local fill_command="{res=($res); printf \"%s%s|\n\", $0, $repeat_pattern}"

    echo "$upper_fence"

    sed -r "$regex_counter" <<< $4

    echo "$lower_fence"
}

printHeader "#" "#" 10 "สุนัขจิ้งจอกเร็วกระโดดข้ามสุนัขขี้เกียจ"

เอาต์พุตปัจจุบันที่ไม่มีโทเค็นสุดท้าย:

##########
สุนัขจิ้งจอกที่รวดเร็ว
กระโดดข้าม
สุนัขขี้เกียจ
##########
Bruno Henrique Peixoto avatar
in flag
ฉันเพิ่มตัวอย่างตามที่คุณแนะนำ
Bruno Henrique Peixoto avatar
in flag
คำถามที่ดี! เป็นคำถามเปิดสำหรับปัญหา เราอาจแท็กบรรทัดด้วย a
Bruno Henrique Peixoto avatar
in flag
แต่ลองพิจารณาในกรณีที่จำนวนอักขระมากกว่าคำที่มากที่สุด มันดูสมเหตุสมผลสำหรับข้อความภาษาธรรมชาติ
bac0n avatar
cn flag
`| fmt -w 11` .. (คิดว่าต้องนับบรรทัดใหม่ด้วย)
Bruno Henrique Peixoto avatar
in flag
คำตอบประเสริฐ มันโอเคสำหรับฉันแล้ว! ในกรณีที่ฉันต้องการใส่ตัวคั่นเพื่อแสดงขีด จำกัด บรรทัดรหัสมีการเปลี่ยนแปลงมากหรือไม่?
Score:2
ธง cn
sed -r 's/([^ .]+ [^ .]+) /\1\n/g' <<< "สุนัขจิ้งจอกเร็วกระโดดข้ามสุนัขขี้เกียจ"
อย่างรวดเร็ว
สุนัขจิ้งจอกกระโดด
มากกว่า
สุนัขขี้เกียจ

ชุดอักขระ [^ .]+ หมายถึงหนึ่งหรือมากกว่า + ตัวละครใด ๆ . ไม่รวม ^ ช่องว่าง ดังนั้นการจับกุมกลุ่ม ([^ .]+ [^ .]+) ตรงกับรูปแบบเช่น สตริงสตริง. นิพจน์ทั่วไปทั้งหมดมีช่องว่างเพิ่มเติมที่ส่วนท้าย ([^ .]+ [^ .]+) (อาจรวมอยู่ในกลุ่มจับภาพเพื่อรักษาไว้)

กับ เสด โดยใช้สิ่งทดแทน คำสั่ง เราแทนที่รูปแบบที่ตรงกันด้วยเนื้อหาของกลุ่มจับภาพแรก \1 และขึ้นบรรทัดใหม่ \n แทนช่องว่าง โดยธง เราทำซ้ำคำสั่งจนจบแต่ละบรรทัด เดอะ -ร ตัวเลือกเปิดใช้งานนิพจน์ทั่วไปแบบขยาย


อัปเดต - นี่คือคำตอบจริง:

sed -r 's/(.{8}) /\1\n/g' <<< "เราจะรู้ได้อย่างไรว่ามันจะตรงกับจำนวนอักขระที่กำหนดไว้ล่วงหน้า"
เราจะทำอย่างไร
รู้ว่ามันเป็น
กำลังจะ
ตรงกับ
กำหนดไว้ล่วงหน้า
จำนวน
ตัวอักษร?

ในตัวอย่างนี้ เราจับสตริงที่มีความยาวอย่างน้อย 8 อักขระ (รวมช่องว่าง) ตามด้วยช่องว่าง เราสามารถตรวจสอบความยาวจริงของบรรทัดผลลัพธ์ได้ดังนี้:

sed -r 's/(.{8}) /\1\n/g' <<< "เราจะรู้ได้อย่างไรว่ามันจะตรงกับจำนวนอักขระที่กำหนดไว้ล่วงหน้า" \
    | awk '{ความยาวการพิมพ์}'
9
10
8
9
11
9
11

และด้วยความช่วยเหลือของคำตอบของคำถาม จะใช้ printf เพื่อพิมพ์อักขระหลายครั้งได้อย่างไร [อ๊าก] เราสามารถบรรลุผลที่ต้องการได้

sed -r 's/(.{8}) /\1\n/g' <<< "เราจะรู้ได้อย่างไรว่ามันจะตรงกับจำนวนอักขระที่กำหนดไว้ล่วงหน้า" \
    | awk '{ ส่วนที่เหลือ = (12 - ความยาว); printf "%s%s|\n", $0, substr(".........", 1, ที่เหลือ)}'
เราจะทำอย่างไร...|
รู้ไว้ใช่ว่า..|
จะไป....|
ตรงกับ...|
กำหนดไว้ล่วงหน้า|
จำนวน...|
ตัวอักษร?.|

ในกรณีที่คุณต้องการแยกคำ ให้ลบช่องว่างสุดท้ายออกจากนิพจน์ทั่วไปด้านบน /(.{8})/. ต่อไปนี้คือตัวอย่างที่ความยาวบรรทัดสูงสุดจะเท่ากับ 10 อักขระหรือน้อยกว่า โดยที่ตัวที่สอง เสด คำสั่งจะตัดแต่งช่องว่างรอบๆ แต่ละบรรทัดใหม่

sed -r 's/(.{10})/\1\n/g' <<< "เราจะรู้ได้อย่างไรว่ามันจะตรงกับจำนวนอักขระที่กำหนดไว้ล่วงหน้า" \
    | sed -r 's/(^ | $)//g' \
    | awk '{ ส่วนที่เหลือ = (10 - ความยาว); printf "%s%s|\n", $0, substr(".........", 1, ที่เหลือ)}'
เราจะทำอย่างไร|
รู้ว่ามันคือ|
จะไป..|
ตรงกับ.|
กำหนดล่วงหน้า|
d หมายเลข o|
ฉ ตัวอักษร|
อาร์เอส?.......|
Bruno Henrique Peixoto avatar
in flag
เราจะรู้ได้อย่างไรว่ามันจะตรงกับจำนวนอักขระที่กำหนดไว้ล่วงหน้า
pa4080 avatar
cn flag
สวัสดี @BrunoHenriquePeixoto ฉันได้อัปเดตคำตอบด้วยเรื่องตลกเล็กน้อยสำหรับคำถามของคุณ
Bruno Henrique Peixoto avatar
in flag
ยอดเยี่ยม! ความปรารถนาสุดท้าย อัจฉริยะ ขอให้คุณใส่เชอร์รี่ไว้ด้านบนโดยคั่นอักขระสุดท้าย ({max_val} หรือ {max_val+1} ก็ได้)อาจเป็นสัญลักษณ์บางอย่าง | หรือ # ไม่สำคัญ
pa4080 avatar
cn flag
@BrunoHenriquePeixoto ฉันไม่เข้าใจข้อกำหนดนี้ คุณอาจต้องใช้นิพจน์ที่สองเป็น: `sed -r -e 's/(.{8}) /\1\n/g' -e 's/(.)$/\|\1/'` แต่ฉัน ไม่แน่ใจ หรือถ้าคุณต้องการแก้ไขแต่ละบรรทัดใหม่ วิธีที่ขี้เกียจที่สุดคือการประมวลผลครั้งที่สองเป็น: `sed -r 's/(.{8}) /\1\n/g' in-file.txt | sed -r 's/(.)$/\|\1/'`
Bruno Henrique Peixoto avatar
in flag
ตัวอย่าง: กำหนดชื่อโปรไฟล์ของคุณเป็น "pa4080" (6 หลัก) จำนวนสูงสุด 10 บรรทัดหลักและตัวคั่นไปป์ '|' และจุดสำหรับเว้นวรรคต่อท้าย ผลลัพธ์ต้องเป็น "pa4080....|" โดยไม่ต้องใส่ double คำพูด
pa4080 avatar
cn flag
@BrunoHenriquePeixoto โปรดตรวจสอบการอัปเดต :)
Bruno Henrique Peixoto avatar
in flag
คุณควรจะอยู่ในหอเกียรติยศของ stack oveflow
Bruno Henrique Peixoto avatar
in flag
ตัวอย่างย่อยดูเหมือนจะเลอะเทอะเล็กน้อย กิจวัตรซ้ำ ๆ บางอย่างดีกว่า เราทำได้ดีมาก!
Bruno Henrique Peixoto avatar
in flag
มีปัญหากับ sed ที่เรานำมาใช้ ลองดูที่เนื้อหาหลักของโพสต์
pa4080 avatar
cn flag
สวัสดี @BrunoHenriquePeixoto หากคุณต้องการทำลายคำ ลองลบช่องว่างสุดท้ายออกจาก regex: `/(.{8}) /` => `/(.{8})/` ฉันได้เพิ่มการอัปเดตในคำตอบแล้ว
Bruno Henrique Peixoto avatar
in flag
ฉันต้องการให้คำตอบมากขึ้น! :(! ขอบใจ
Bruno Henrique Peixoto avatar
in flag
โหวต กอด เงิน แคลอรี่ เครดิต ดาว อะไรก็ตามที่นับ
pa4080 avatar
cn flag
@BrunoHenriquePeixoto คุณสามารถโหวตได้โดยคลิกที่ลูกศรขึ้น :)
Bruno Henrique Peixoto avatar
in flag
ฉันจะโหวตทุกวันในชีวิตของฉัน
Bruno Henrique Peixoto avatar
in flag
รางวัลของคุณ: https://github.com/brunolnetto/engage

โพสต์คำตอบ

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