Используемая вами команда должна работать как есть с GNU sed
. Но с BSD sed
, который, например, поставляется с OS X, не будет.
Если вы пытаетесь использовать расширенные регулярные выражения - которые поддерживают метасимвол +
- вам необходимо явно включить их. Для BSD sed
вы делаете это с помощью sed -E
, а для GNU sed
с помощью sed -r
.
Один только \+
делает с GNU sed
когда ERE не включены, но это менее переносимо.
Вы используете Perl-подобные \s
, которых нет ни для базовых, ни для расширенных регулярных выражений. Regular sed
не поддерживает регулярные выражения Perl. GNU sed
поддерживает \s
- но было бы более переносимо просто добавить пробел к вашему регулярному выражению.
Наконец, твой .
соответствует одному символу, поэтому ваше регулярное выражение будет соответствовать любому символу в этом месте, а не только точке. Используйте \.
чтобы правильно избежать этого.
Таким образом, решение для GNU sed
:
$ echo "2.12 blah" | sed -r 's/^[0-9]+\.[0-9]+ //'
blah
Или для BSD sed
:
$ echo "2.12 blah" | sed -E 's/^[0-9]+\.[0-9]+ //'
blah
Таким образом, вам не нужно другое регулярное выражение для разных версий sed
. С вашим примером:
$ cat test
3.15 Chichewa
3.16 Chimane
3.17 Cinghalais
3.18 Créole de Guinée-Bissau
$ sed -r 's/^[0-9]+\.[0-9]+ //' test
Chichewa
Chimane
Cinghalais
Créole de Guinée-Bissau
Если реальная проблема заключается в том, что вы хотите получить второй столбец файла, разделенного пробелами, то вы поступите неправильно. Либо используйте awk
, как говорит @Srdjan Grubor, либо используйте cut
:
$ echo "2.12 foo bar baz" | cut -d' ' -f2-
foo bar baz
Параметр -f2-
указывает второй и все последующие столбцы, поэтому в качестве первого разделителя он будет взят в качестве первого пробела, а остальные будут выведены.