Как sed заменить \ (обратная косая черта + пробел)?

В сценарии bash файлы с пробелами отображаются как "File\ with\ spaces.txt", и я хочу заменить эти пробелы с косой чертой на _ или +.

Как я могу сказать sed сделать это? У меня не было успеха в использовании;

$1=~/File\ with\ spaces.txt
ext=$1
web=$(echo "$ext" | sed 's/\ /+/')

Я открыт для предложений, если есть лучший способ, чем через sed.

[РЕДАКТИРОВАТЬ]: решение Foo Bah работает хорошо, но оно заменяет только первый пробел, потому что текст, следующий за ним, рассматривается как аргументы, а не как часть $1. Как-нибудь обойти это?


person octosquidopus    schedule 12.09.2011    source источник


Ответы (4)


Sed прекрасно распознает \ как пробел:

bee@i20 ~ $ echo file\ 123 | sed 's/\ /+/'
file+123

Однако синтаксис вашего сценария bash неверен. Не уверен, что вы пытались сделать со скриптом, но вот пример замены пробелов на +:

ext=~/File\ with\ spaces.txt
web=`echo "$ext" | sed 's/\ /+/g'`
echo $web

Upd: О, и вам нужен флаг g для замены всех вхождений пробела, а не только первого. Исправлено выше.

person letitbee    schedule 12.09.2011
comment
хорошо, тогда просто замени первую строку на ext=$1. И запустить с соответствующим аргументом. - person letitbee; 13.09.2011
comment
Тем не менее, это заменяет только первый пробел. После этого слова с разделителями рассматриваются как аргументы. - person octosquidopus; 13.09.2011
comment
Ура! Это было все о g :) Большое спасибо! - person octosquidopus; 13.09.2011
comment
Простой альтернативой является использование tr: stackoverflow.com/a/1252010/38368, то есть tr --delete '\\\n' - person Danny Varod; 05.03.2020

sed 's/\\\\ /+/';

\\\\ оценивается как \\ на уровне оболочки, а затем как литерал \ внутри sed.

person Marc B    schedule 12.09.2011
comment
Если бы вы использовали двойные кавычки, вы были бы правы; поскольку вы использовали одинарные кавычки, оболочка не удаляет слой обратной косой черты. - person Jonathan Leffler; 13.09.2011

вы хотите избежать косой черты:

web=$(echo "$ext" | sed 's/\\ /_/g')
person Foo Bah    schedule 12.09.2011
comment
Нет, это не правильно. Это заменит фактическую обратную косую черту + пробел. - person letitbee; 13.09.2011
comment
Это то, о чем просит вопрос (или заголовок вопроса): вывод bash включает обратную косую черту, а комбинацию обратной косой черты + пробел необходимо заменить на подчеркивание. OTOH, я полагаю, что есть вероятность, что вопрос (тело вопроса) не совсем уверен, что ему нужно. - person Jonathan Leffler; 13.09.2011
comment
решение letitbee сработало лучше всего. sed 's/\ /+/g' это то, что я искал. - person octosquidopus; 13.09.2011

одинарные кавычки - ваш друг, следующее следует использовать с аргументами в одинарных кавычках для $ 1 и $ 2

#!/bin/bash
ESCAPE='\\'
if [ $# -ne 2 ];then   
  echo "$0 <TO_ESCAPE> <IN_STRING>"
  echo args should be in single quotes!! 
  exit 1
fi

TO_ESCAPE="${1}"
IN_STRING="${2}"

if [ ${TO_ESCAPE} = '\' ];then
  TO_ESCAPE='\\'
fi
echo "${IN_STRING}" | sed "s/${TO_ESCAPE}/${ESCAPE}${TO_ESCAPE}/g"
person William Wallace    schedule 11.06.2015