ฉันจะเพิ่มแบ็กสแลชก่อนช่องว่างทั้งหมดได้อย่างไร


8

ฉันจะใส่แบ็กสแลชต่อหน้าทุกช่องว่างได้ดีกว่าโดยใช้trหรือsedคำสั่งได้อย่างไร

นี่คือสคริปต์ของฉัน:

#!/bin/bash
line="hello bye"
echo $line | tr ' ' "\\\ "

นี่ควรจะแทนที่ช่องว่างด้วยแบ็กสแลชตามด้วยช่องว่าง แต่มันจะแทนที่ช่องว่างด้วยแบ็กสแลชเท่านั้นและไม่ใช่แบ็กสแลช + ช่องว่าง

นี่คือผลลัพธ์ที่ฉันได้รับ:

hello\bye

ผลลัพธ์ที่คาดหวัง:

hello\ bye

คุณช่วยอธิบายเพิ่มเติมหน่อยได้ไหม? คุณกำลังมองหาสคริปต์ที่เปลี่ยนไฟล์ข้อความหรือไม่? คุณกำลังมองหาอะไรอยู่
Fabby

tr x ' 'ซึ่งxเป็นตัวละครที่คุณต้องการที่จะเปลี่ยน?
Doorknob

อัปเดต - ตัวอย่างที่เพิ่มเข้ามา
daka

คำตอบ:


17

trไม่สามารถทำได้หลายตัว ใช้สิ่งใดสิ่งหนึ่งต่อไปนี้แทน:

  1. sed

    echo "$line" | sed 's/ /\\ /g' 
    

    หรือ

    sed 's/ /\\ /g' <<< "$line"
    
  2. Perl

    echo "$line" | perl -pe 's/ /\\ /g'  
    

    หรือ

    perl -pe 's/ /\\ /g'<<< "$line"
    

    Perl ยังมีฟังก์ชั่นที่ดีที่เรียกว่าquotemetaซึ่งสามารถหลบหนีสิ่งที่แปลกทั้งหมดในสตริง:

    line='@!#$%^&*() _+"'
    perl -ne 'print quotemeta($_)' <<< $line
    

    ด้านบนจะพิมพ์ออกมา

    \@\!\#\$\%\^\&\*\(\)\ _\+\"\
    
  3. คุณยังสามารถใช้printfและ%q:

    %q  quote the argument in a way that can be reused as shell input
    

    ดังนั้นคุณสามารถทำได้

    echo "$line" | printf "%q\n" 
    

    โปรดทราบว่าสิ่งนี้เช่น Perl quotemetaจะหลบหนีอักขระพิเศษทั้งหมดไม่ใช่แค่ช่องว่าง

    printf "%q\n" <<<$line
    
  4. หากคุณมีบรรทัดในตัวแปรคุณสามารถทำได้โดยตรงใน bash:

    echo ${line// /\\ }
    

ใช่ใช้งานได้ แต่ไม่ทำงานเมื่อต้องการแทนที่การเกิด "a" ทั้งหมดด้วย backlash + space
daka

@sudoman ฉันได้เพิ่มตัวเลือกเพิ่มเติมเนื่องจากคุณมีบรรทัดในตัวแปรอยู่แล้ว
terdon

printfbuiltinของ Bash นั้นมีฟังก์ชั่นคล้ายกับquotemeta- printf '%q\n' "$line"ควรทำมัน IIRC
evilsoup

4

ไม่มีAWKรายการโซลูชันที่เป็นไปได้ทั้งหมดหายไป :)

$ echo "Hello World" | awk '{gsub(/ /,"\\ ");print}'                                                                             
Hello\ World
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.