2012-05-02 5 views
4

Привет с помощью следующей команды на машине x86 (с использованием/бен/ш) возвращает: <port>3<port>SED возвращаются разные результаты на разных платформах

test="port 3" 
echo $test | sed -r 's/\s*port\s*([0-9]+)\s*/<port>\1<\/port>/' 

но работает же команду на ш оболочке сетевой коммутатор на основе ARM возвращает строка port 3.

Как я могу получить такой же результат на коммутаторе, как и на моей машине x86? Мне кажется, что цифра не фиксируется [0-9].

ответ

3

\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 *, результат зависел бы от того, какие файлы существуют в текущем каталоге.

+0

Благодарим Гиллеса за подробный ответ. – baltoro

3

Не все вспомогательные средства ss reg-expression короткая, как \s. Более портативная версия

test="port 3" 
    echo "$test" | sed -r 's/[ ]*port[ ]*([0-9]+)[ ]*/<port>\1<\/port>/' 

Если вам действительно нужно проверить на вкладке символов, а также, просто добавьте их к классу полукокса (во всех 3-х местах), что, в моем примере содержат только космические символы, т.е. [ ] немного.

выход

<port>3</port> 

Я надеюсь, что это помогает.

+0

Да. Это сработало. Благодарю. – baltoro

+1

baltusaj: Спасибо, я рад, что помог. Я бы порекомендовал вам принять ответ @Giles, так как он лучше объясняет решение. И также лучше использовать '[: space:]', если ваша система поддерживает его (большинство из них). Всем удачи. – shellter

+0

Вы были первыми, кто ответил, но по вашей рекомендации принял ответ Джайлса. – baltoro