\s
- расширение GNU для стандартного поведения sed. GNU sed - это реализация на настольных/серверных Linux-системах. Большинство встроенных систем Linux используют BusyBox, набор утилит с заметно меньшим размером и меньшим количеством функций.
Стандартный способ указания «любого символа пробела» - [:space:]
character class. Он поддерживается BusyBox (по крайней мере, большинством установок BusyBox, большинство функций BusyBox можно отключить для еще более низкого значения).
BusyBox также не поддерживает опцию -r
, вам необходимо использовать basic regular expression. В BRE, \(…\)
маркирует группы, и нет +
оператора, только *
.
echo "$test" | sed 's/[[:space:]]*port[[:space:]]*\([0-9][0-9]*\)[[:space:]]*/<port>\1<\/port>/'
Обратите внимание, что, так как вы не поместили кавычки $test
, оболочка выполняется разбиение слов и подстановочных расширение на значение переменной. То есть значение переменной рассматривалось как список имен файлов, разделенных пробелами, которые затем соединялись одним пробелом. Поэтому, если вы не учитываете кавычки, вам не нужно беспокоиться о разных типах пробелов, вы можете написать echo $test | sed 's/ *port *([0-9][0-9]*) */<port>\1<\/port>/'
. Однако, если $test
был port *
, результат зависел бы от того, какие файлы существуют в текущем каталоге.
Благодарим Гиллеса за подробный ответ. – baltoro