6

Я пытаюсь удалить первое вхождение цифры (й), точку, второе вхождение цифры (ей) и пробел перед словом.

Я придумал это регулярное выражение:

sed 's/^[0-9]\+.[0-9]\+\s//' input.txt > output.txt

Образец текста:

2.14 Italien
2.15 Japonais

Мое регулярное выражение не работает, к сожалению. Есть проблема с \s но я не могу точно определить, что это ...

Кто-нибудь может помочь?

редактировать: проблема в том, что мне нужно удалить первый пробел только потому, что некоторые тексты содержат пробелы, как вы можете видеть ниже:

3.15 Chichewa
3.16 Chimane
3.17 Cinghalais
3.18 Créole de Guinée-Bissau

5 ответов5

12

Используемая вами команда должна работать как есть с 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- указывает второй и все последующие столбцы, поэтому в качестве первого разделителя он будет взят в качестве первого пробела, а остальные будут выведены.

7

Почему бы не использовать awk?

cat  input.txt | awk '{print $2}' > output.txt
2

Если единственное, что нужно, это сбросить все, включая первый пробел, то этого достаточно.

sed -e 's/[^ ]* //'
1

С любым седом:

sed 's/^[0-9]\{1,\}\.[0-9]\{1,\} //' 

Или, возможно, этого может быть достаточно:

sed 's/^[0-9.]\{1,\} //' file
1

Вы также можете использовать grep:

grep -oP '[a-zA-Z]+$' input.txt > output.txt

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .