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


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// /\\ }
    

да, это работает, но не работает, когда требуется заменить все вхождения "a" на обратную сторону + пробел.
Дака

@sudoman Я добавил еще несколько опций, так как у вас уже есть строка в переменной.
тердон

printfВстроенная функция Bash имеет схожую функциональность quotemeta- printf '%q\n' "$line"должна это делать IIRC.
evilsoup

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.