Як я можу додати звороту косу рису перед усіма пробілами?


8

Як я можу поставити зворотний нахил перед кожним пробілом, бажано за допомогою команд trчи sedкоманд?

Ось мій сценарій:

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

Це повинно замінити пробіли косою косою рисою, за якою слід пробіл, але це лише заміна пробілів з косою косою рисою, а не заднім числом + пробілом.

Це результат, який я отримую:

hello\bye

Очікуваний вихід:

hello\ bye

Не могли б ви детальніше розібратися в цьому? Шукаєте сценарій, який змінює текстовий файл? Що саме ви шукаєте?
Фабі

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

так, це працює, але не працює, коли потрібно замінити всі випадки "а" на люфт + пробіл.
daka

@sudoman Я додав ще кілька варіантів, оскільки ви вже маєте рядок у змінній.
тердон

У Bash printfвбудовані мають функції , аналогічні quotemeta- printf '%q\n' "$line"має це зробити IIRC.
злий

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.