Сед не работает при замене некоторых регулярных выражений - PullRequest
1 голос
/ 24 мая 2019

Я пытаюсь удалить цифры - но только когда они сразу следуют за периодами.Подобные замены, кажется, работают правильно, но не с периодами.

Я пробовал следующее, которое было дано в качестве решения в другом посте:

echo "fr.r1.1.0" | sed s/\.[0-9][0-9]*/\./g

Я получаю fr.....Кажется, что хотя я избегаю точки, она соответствует произвольным символам, а не только точкам.

Это выражение работает для предыдущего примера:

echo "fr.r1.1.0" | sed s/[[:punct:]][0-9][0-9]*/\./g 

и дает мне fr.r1..но тогда для

echo "ge.s1_1.0" | sed s/[[:punct:]][0-9][0-9]*/\./g

я получаю ge.s1.. вместо ge.s1_1.

1 Ответ

1 голос
/ 24 мая 2019

Вам нужно будет поместить инструкции sed между одинарными кавычками, чтобы избежать интерпретации некоторых специальных символов вашей оболочкой:

echo "fr.r1.1.0" | sed 's/\.[0-9][0-9]*/\./g'
fr.r1..

Также вам не нужно экранировать точку в замещающей части (.) и [0-9][0-9]* можно упростить до [0-9]\+ с помощью упрощенной команды:

echo "fr.r1.1.0" | sed 's/\.[0-9]\+/./g'
fr.r1..

Последнее, но не менее важное, поскольку класс символов POSIX [:punct:] определен как

пунктуация (все графические символы, кроме букв и цифр) https://en.wikibooks.org/wiki/Regular_Expressions/POSIX_Basic_Regular_Expressions

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...