Я хочу получить два последних числа (одно целое, одно с плавающей запятой; за ним следует необязательный пробел) и распечатать только их.
Пример:
foo bar <foo> bla 1 2 3.4
Следует напечатать:
2 3.4
Пока у меня есть следующее:
sed -n 's/\([0-9][0-9]*[\ \t][0-9.]*[\ \t]*$\)/replacement/p'
даст мне
foo bar <foo> bla 1 replacement
Однако, если я попытаюсь заменить его на группу 1, будет напечатана вся строка.
sed -n 's/\([0-9][0-9]*[\ \t][0-9.]*[\ \t]*$\)/\1/p'
Как я могу распечатать только ту часть строки, которая соответствует регулярному выражению в группе?
-r
или --regexp-extended, иначе я получалinvalid reference \1 on
ошибку s 'command's RHS'.(
и)
вместо\(
и\)
..*
в конец регулярного выражения, если строка, которую вы хотите извлечь, не всегда находится в конце строки..*
он жадный, а в sed нет не жадного.*?
(
и)
это не вызовет ошибки в ubuntu 16.04. Так что я думаю, что этот комментарий устарел.Grep - правильный инструмент для извлечения.
используя ваш пример и ваше регулярное выражение:
источник
grep -o
вызовов. stackoverflow.com/a/58314379/117471И в качестве еще одного варианта я бы выбрал awk!
Это разделит ввод (здесь я использую STDIN, но ваш ввод легко может быть файлом) на пробелы, а затем распечатать предпоследнее поле, а затем последнее поле.
$NF
переменных содержат количество полей обнаружено после взрыва на пространствах.Преимущество этого заключается в том, что не имеет значения, изменится ли то, что предшествует двум последним полям, до тех пор, пока вам нужны только два последних поля, оно будет продолжать работать.
источник
Команда вырезания предназначена именно для этой ситуации. Он будет «вырезать» любой разделитель, а затем вы можете указать, какие фрагменты следует выводить.
Например:
echo "foo bar <foo> bla 1 2 3.4" | cut -d " " -f 6-7
Результатом будет вывод:
2 3.4
-d устанавливает разделитель
-f выбирает диапазон «полей» для вывода, в данном случае это фрагменты с 6-го по 7-й исходной строки. Вы также можете указать диапазон в виде списка, например
6,7
.источник
awk '{ print $2" "$6 }'
cut -d " " -f 2,6
Я согласен с @kent, что это хорошо подходит
grep -o
. Если вам нужно извлечь группу в шаблоне, вы можете сделать это с помощью второй команды grep.источник