Làm cách nào tôi có thể thêm dấu gạch chéo ngược trước tất cả các khoảng trắng?


8

Làm cách nào tôi có thể đặt dấu gạch chéo ngược trước mỗi khoảng trắng, tốt nhất là bằng cách sử dụng trhoặc sedlệnh?

Đây là kịch bản của tôi:

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

Điều này được cho là để thay thế khoảng trắng bằng dấu gạch chéo ngược theo sau là khoảng trắng, nhưng nó chỉ thay thế khoảng trắng bằng dấu gạch chéo ngược chứ không phải dấu gạch chéo + dấu cách.

Đây là đầu ra tôi nhận được:

hello\bye

Sản lượng dự kiến:

hello\ bye

Bạn có thể vui lòng giải thích một chút về điều đó? Bạn đang tìm kiếm một kịch bản thay đổi một tập tin văn bản? Chính xác thì bạn đang tìm điều gì?
Fabby

tr x ' ', xnhân vật bạn muốn thay thế ở đâu?
tay nắm cửa

cập nhật - thêm ví dụ.
daka

Câu trả lời:


17

trkhông thể làm nhiều nhân vật. Sử dụng một trong số này thay thế:

  1. sed

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

    hoặc là

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

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

    hoặc là

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

    Perl cũng có một hàm tiện lợi được gọi là quotemetacó thể thoát khỏi tất cả những thứ kỳ lạ trong một chuỗi:

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

    Ở trên sẽ in

    \@\!\#\$\%\^\&\*\(\)\ _\+\"\
    
  3. Bạn cũng có thể sử dụng printf%q:

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

    Vì vậy, bạn có thể làm

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

    Lưu ý rằng điều này, giống như Perl quotemetasẽ thoát khỏi tất cả các ký tự đặc biệt, không chỉ là khoảng trắng.

    printf "%q\n" <<<$line
    
  4. Nếu bạn có dòng trong một biến, bạn có thể thực hiện trực tiếp trong bash:

    echo ${line// /\\ }
    

có, điều này hoạt động, nhưng không hoạt động khi muốn thay thế tất cả các lần xuất hiện của "a" bằng dấu gạch chéo + dấu cách.
daka

@sudoman Tôi đã thêm một số tùy chọn vì bạn đã có dòng trong một biến.
terdon 14/03/2015

Bash của printfBUILTIN có chức năng tương tự như quotemeta- printf '%q\n' "$line"nên làm điều đó IIRC.
evilsoup 15/03/2015

4

AWKthiếu trong danh sách tất cả các giải pháp có thể :)

$ echo "Hello World" | awk '{gsub(/ /,"\\ ");print}'                                                                             
Hello\ World
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.