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

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

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

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

Это, как предполагается, заменяет пробелы обратной косой чертой, сопровождаемой пространством, но это только заменяет пробелы обратной косой чертой и не backlash+space.

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

hello\bye

Ожидаемый вывод:

hello\ bye
8
задан 24 December 2017 в 03:30

2 ответа

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. Если у Вас есть строка в переменной, Вы могли бы просто сделать это непосредственно в ударе:

    echo ${line// /\\ }
    
16
ответ дан 23 November 2019 в 05:23

Существует AWK пропавшие без вести в списке всех возможных решений :)

$ echo "Hello World" | awk '{gsub(/ /,"\\ ");print}'                                                                             
Hello\ World
4
ответ дан 23 November 2019 в 05:23

Другие вопросы по тегам:

Похожие вопросы: