Использование sed для удаления цифр и пробелов из строки

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

Я придумал следующее выражение:

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

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

2.14 Italien
2.15 Japonais

мой regex не работает, к сожалению. Существует проблема с s но я не могу определить, что это такое...

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

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

3.15 Chichewa
3.16 Chimane
3.17 Cinghalais
3.18 Créole de Guinée-Bissau
1
задан balteo
02.02.2023 15:32 Количество просмотров материала 3349
Распечатать страницу

5 ответов

команда, которую вы используете, должна работать как есть с GNU sed. Но с BSD sed, который, например, поставляется с OS X, он не будет.

  • если вы пытаетесь использовать Расширенные Регулярные Выражения – которые поддерживают + metacharacter – необходимо явно включить их. Для BSD sed для этого sed -E, а для GNU sed С sed -r.

    \+ только тут С GNU sed когда EREs не включены, но это менее переносимо.

  • вы используете Perl-like \s, который не существует как для основных, так и для расширенных регулярных выражений. Обычный 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

если real проблема в том, что вы хотите получить второй столбец файла с разделителями пробелов, а затем ты идешь по неправильному пути. Либо используйте awk, как говорит @Srdjan Grubor, или используйте cut:

$ echo "2.12 foo bar baz" | cut -d' ' -f2-
foo bar baz

-f2- задает второй и все следующие столбцы, так что это будет в основном принимать первый пробел в качестве разделителя и выводить остальное.

12
отвечен slhck 2023-02-03 23:20

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

cat  input.txt | awk '{print }' > output.txt
7
отвечен Srdjan Grubor 2023-02-04 01:37

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

sed -e 's/[^ ]* //'
2
отвечен vortex7 2023-02-04 03:54

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

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

1
отвечен mohit6up 2023-02-04 06:11

С любой СЭД:

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

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

sed 's/^[0-9.]\{1,\} //' file
1
отвечен Scrutinizer 2023-02-04 08:28

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх