Как добавить обратную косую черту перед всеми пробелами?

8

Как поставить обратную косую черту перед каждым пробелом, желательно с помощью команд trили sed?

Вот мой сценарий:

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

Предполагается, что это заменяет пробелы обратным слэшем, за которым следует пробел, но это только замена пробелов обратным слешем, а не обратным слэшем + пробелом.

Это вывод, который я получаю:

hello\bye

Ожидаемый результат:

hello\ bye
дака
источник
Не могли бы вы подробнее остановиться на этом? Вы ищете скрипт, который изменяет текстовый файл? Что именно вы ищете?
Fabby
tr x ' 'где xперсонаж, которого вы хотите заменить?
Дверная ручка
обновлено - добавлен пример.
Дака

Ответы:

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// /\\ }
    
terdon
источник
да, это работает, но не работает, когда требуется заменить все вхождения "a" на обратную сторону + пробел.
Дака
@sudoman Я добавил еще несколько опций, так как у вас уже есть строка в переменной.
тердон
printfВстроенная функция Bash имеет схожую функциональность quotemeta- printf '%q\n' "$line"должна это делать IIRC.
evilsoup
4

В AWKсписке отсутствуют все возможные решения :)

$ echo "Hello World" | awk '{gsub(/ /,"\\ ");print}'                                                                             
Hello\ World
Сергей Колодяжный
источник