Bagaimana saya bisa menambahkan garis miring terbalik sebelum semua spasi?

8

Bagaimana saya bisa meletakkan backslash sebelum setiap ruang, lebih disukai dengan menggunakan tratau sedperintah?

Ini skrip saya:

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

Ini seharusnya menggantikan spasi dengan backslash diikuti oleh spasi, tapi itu hanya mengganti spasi dengan backslash dan bukan backlash + spasi.

Ini adalah output yang saya dapatkan:

hello\bye

Output yang diharapkan:

hello\ bye
daka
sumber
Bisakah Anda menjelaskan sedikit tentang itu? Apakah Anda mencari skrip yang mengubah file teks? Apa sebenarnya yang kamu cari?
Fabby
tr x ' ', di mana xkarakter yang ingin Anda ganti?
Gagang pintu
diperbarui - contoh ditambahkan.
daka

Jawaban:

17

trtidak dapat melakukan banyak karakter. Gunakan salah satu dari ini sebagai gantinya:

  1. sed

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

    atau

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

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

    atau

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

    Perl juga memiliki fungsi bagus yang disebut quotemetayang dapat melarikan diri dari semua hal aneh dalam sebuah string:

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

    Di atas akan dicetak

    \@\!\#\$\%\^\&\*\(\)\ _\+\"\
    
  3. Anda juga dapat menggunakan printfdan %q:

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

    Jadi, Anda bisa melakukannya

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

    Perhatikan bahwa ini, seperti Perl, quotemetaakan keluar dari semua karakter khusus, bukan hanya spasi.

    printf "%q\n" <<<$line
    
  4. Jika Anda memiliki baris dalam variabel, Anda bisa langsung melakukannya di bash:

    echo ${line// /\\ }
    
terdon
sumber
ya ini berfungsi, tetapi tidak berfungsi ketika ingin mengganti semua kejadian "a" dengan ruang backlash +.
daka
@sudoman Saya menambahkan beberapa opsi lagi karena Anda sudah memiliki baris dalam sebuah variabel.
terdon
Bash's printfbuiltin memiliki fungsi yang mirip dengan quotemeta- printf '%q\n' "$line"harus melakukannya IIRC.
evilsoup
4

Ada yang AWKhilang dalam daftar semua solusi yang mungkin :)

$ echo "Hello World" | awk '{gsub(/ /,"\\ ");print}'                                                                             
Hello\ World
Sergiy Kolodyazhnyy
sumber