замена специального символа sed, не работающая в сценарии оболочки

Использовать aplay вместо play для проигрывания необработанного файла, этот способ, которым можно указать, что это - необработанное аудио переключателем-t:

aplay -q -c 2 -t raw -f s16 test.raw
2
07.11.2012, 22:29
2 ответа

Я не думаю, что Вы получаете право группы. Попробовать это?

sed 's:\([]\[\^\$\.\*\/]\):\\\1:g'

Править: nevermind, я не знал об уместности и. Проблема - Вы, нуждаются к дополнительному Escape в наклонных чертах в замене из-за парсинга и передачи оболочке sub.

sed 's:[]\[\^\$\.\*\/]:\\\\&:g'

Кроме того, при использовании $ (команда) вместо обратных галочек Вам не нужен дополнительный \

4
27.01.2020, 21:57
  • 1
    Да, если я добавлю еще два '\', как Вы сделали будет работать. Но я не вижу, почему они необходимы. Существует ли ссылка, можно ли указать на меня для понимания этого? Кроме того, не уверенный, что Вы имеете в виду относительно $ (команда) –  drapkin11 08.11.2012, 00:15
  • 2
    в обратных галочках используют простую замену - так, команда анализируется текущей оболочкой. $(command) открывает подоболочку, таким образом, что-либо в parens работает как будто на его собственной командной строке. См. больше информации: wiki.bash-hackers.org/syntax/expansion/cmdsubst –  Drake Clarris 08.11.2012, 16:58

Итак, задача состоит в том, чтобы написать sed подстановку, которая экранирует все специальные символы (определяемые как символы []^$.*/, и я добавил \ тоже) в строке.

Подстановка может выглядеть так

s/[][\^$.*/]/\\&/g

Обратите внимание, что нам не нужно экранировать ни один из символов в наборе [...] (\ тоже воспринимается буквально, поэтому мы не можем ничего там экранировать), и что единственное, в чем мы должны быть уверены, это то, что ] находится в самом начале.

Таким образом, сценарий (переписанный как функция shell и переделанный другими способами) становится

function escape
{
    printf '%s\n' "$1" | sed 's/[][\^$.*/]/\\&/g'
}

Тестирование:

$ escape 'hello world'
hello world

$  escape '*.*'
\*\.\* 

$ escape '\/'
\\\/

$ escape '/\'
\/\\

$ escape 's/[][\^$.*/]/\\&/g'
s\/\[\]\[\\\^\$\.\*\/\]\/\\\\&\/g
1
27.01.2020, 21:57

Теги

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