Как использовать sed для получения номера версии

No, los módulos pam_*.soson ​​bibliotecas compartidas:

/lib/x86_64-linux-gnu/security# file pam_limits.so 
pam_limits.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV),
dynamically linked, BuildID[sha1]=..., stripped

Y los de mi sistema Ubuntu ni siquiera tienen configurados los xbits. Dado que técnicamente son archivos ELF, puede intentar ejecutarlos, pero en realidad no funciona:

/tmp$ chmod +x pam_limits.so 
/tmp$./pam_limits.so 
Segmentation fault

Las bibliotecas PAM las cargan, según la configuración en /etc/pam.d/. Los módulos pueden recibir argumentos allí, p.:

session       required   pam_env.so readenv=1 envfile=/etc/default/locale

La ​​página del manual solo documenta las opciones que se pueden usar aquí.

2
01.08.2019, 23:24
5 ответов

Если известно, что номер версии находится между следующим -- -последним дефисом и последним дефисом, простой

sed 's/.*-\(.*\)-.*/\1/'

должно помочь.

3
27.01.2020, 21:58

Получить части между -и -с одной или двумя точками, разделяющими числа:

sed -En 's/.*-([0-9]+\.)([0-9]+\.)?([0-9]+)-.*/\1\2\3/p' file

При использовании флага -nи …/pтолько строк версии, состоящих из совпадающих строк с номером версии. Если строка не содержит соответствующей строки версии, ничего не печатается.

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

1
27.01.2020, 21:58

Протестировано с помощью приведенной ниже команды, все работает нормально

sed -e "s/.*[a-z][0-9]\?-//g" -e "s/-.*//g" filename

выход

1.0.2
2.1.4
8.0

Протестировано с помощью кода Python

#!/usr/bin/python
import re
k=open('filename','r')
h=re.compile(r'(-([0-9]\.?){1,4})')
for i in k:
    u=re.search(h,i)
    print u.group().replace("-","")



output

 python e.py 
1.0.2
2.1.4
8.0
0
27.01.2020, 21:58
$ sed -E 's/.*-([[:digit:]]+(\.[[:digit:]]+)+)-.*/\1/' file
1.0.2
2.1.4
8.0

Номер версии содержится между двумя -и состоит из положительного целого числа ([[:digit:]]+), за которым следует точка и еще одно положительное целое число, по крайней мере один раз((\.[[:digit:]]+)+). Мы сопоставляем это и фиксируем строку между тире. Вся линия заменяется захваченной группой.

Использование стандартного базового регулярного выражения вместо расширенного выражения:

sed 's/.*-\([[:digit:]]\{1,\}\(\.[[:digit:]]\{1,\}\)\{1,\}\)-.*/\1/' file

Быстрый и грязный вариант для захвата любой части строки между тире, которая содержит только цифры и точки:

sed -E 's/.*-([[:digit:].]+)-.*/\1/' file
1
27.01.2020, 21:58

Если вы не настаиваете на использовании sed, есть еще один способ — использовать grepс поддержкой Perl Compatible Regular Expression (PCRE )(-P).

grep -Po '(?<=-)[0-9.]+' file

Утверждение (?<=pattern)является ретроспективным утверждением. Таким образом, мы ищем соответствие цифре (0-9)или точке(.)один или несколько раз (+), которые следуют за символом дефиса.

1
27.01.2020, 21:58

Теги

Похожие вопросы