sed: игнорировать подстроку, которая может присутствовать или не присутствовать - PullRequest
0 голосов
/ 04 января 2019

С помощью sed мне нужно сопоставить и игнорировать подстроку, которая может существовать или не существовать

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

>package-1.22.3.src.tar.gz<
>package-1.22.4.src.tar.gz<
>package-1.23.tar.gz<
>package-1.23.1.tar.gz<

Этовот что я пробовал:

sed "s,.*>package-\(.[^<]*\)\(\.src\)\?\.tar.*<,\1,g"

Я хочу регулярное выражение sed, которое будет выводить это:

1.22.3
1.22.4
1.23
1.23.1

Однако я получаю

1.22.3.src
1.22.4.src
1.23
1.23.1

Ответы [ 2 ]

0 голосов
/ 04 января 2019

Это sed должно работать:

sed -E -n 's/.*-(.*\.[0-9]+).*<$/\1/p'

Выход:

1.22.3
1.22.4
1.23
1.23.1
0 голосов
/ 04 января 2019

Шаблон .[^<]* соответствует любому символу с ., а затем [^<]* соответствует любому 0+ символу, кроме <. Он соответствует .src части, следовательно, необязательный \(\.src\)\? не должен совпадать, и .src попадает в Группу 1.

Если вы хотите исправить свой текущий код, просто сопоставьте цифры и точки после package- с [0-9.]*:

sed "s,.*>package-\([0-9.]*\)\(\.src\)\?\.tar.*<,\1,g"
                    ^^^^^^^ 

См. онлайн демо

Если у вас есть GNU grep, вы также можете использовать PCRE-шаблон, например

grep -oP ">package-\K\d+(\.\d+)+"

См. еще одну онлайн-демонстрацию . Здесь после совпадения >package- текст удаляется из совпадения с помощью оператора \K, а затем 1+ цифр с 1 или более повторениями . и 1+ цифр сопоставляются и возвращаются с помощью -o вариант.

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