
Мне нужно использовать регулярное выражение, чтобы удалить весь текст, начинающийся с конца строки и идущий на две точки назад.
gtk2-2.24.22-2.fc20.x86_64
становится
gtk2-2.24.22-2
Это вывод rpm -qa
в текстовый файл, и мне нужно отрезать конец.
решение1
Тынуждатьсярегулярное выражение? Я знаю, что это немного дешевое решение, но регулярные выражения не являются решением для всего.
Например, при работе со строками Bash:
foo="gtk2-2.24.22-2.fc20.x86_64"
echo ${foo%.*.*} # strip the longest match from the last dot
Возврат gtk2-2.24.22-2
.
Вы можете вызвать это для файла следующим образом:
foo=$(head -1 file.txt)
echo ${foo%.*.*} > new-file.txt
Регулярные выражения хороши для разбора чего-либо с самого начала, а не с конца, поскольку они потребляют в "жадной" манере слева направо. Это выполнимо, но вам нужно быть немного более многословным, чем то, что вы могли бы сделать в простом Bash.
Обратите внимание, что то, что выглядит как регулярное выражение в Bash ( .*
), не является «настоящим» регулярным выражением. В настоящем регулярном выражении точка .
представляет все символы, а *
означает, что предыдущий символ (группа) повторяется 0–n раз. Однако в Bash точка .
означает настоящую точку, а *
является подстановочным знаком для всех символов.