Регулярное выражение для grep-заполнителя, за которым следует знаковое число с плавающей точкой

Регулярное выражение для grep-заполнителя, за которым следует знаковое число с плавающей точкой

Я хочу извлечь последний столбец из строк, которые выглядят так:

880.952         NAV_Y                uSimMarine      -146.17516

Число не всегда отрицательное и не имеет фиксированной длины (т.е. не всегда имеет одинаковое количество десятичных знаков).

Это поможет мне проделать большую часть пути:

grep -E "\-?[[:digit:]]{1,3}\.[[:digit:]]{0,5}"

За исключением того, что оно также совпадает с числом в первом столбце.

Если я изменю это так, чтобы включить конец строки и исключить совпадения первого столбца:

grep -E "[[:digit:]]{1,3}\.[[:digit:]]{0,5}$"

У меня нет совпадений, и я этого не понимаю.

Что я здесь упускаю?

решение1

Прикрепите выражение к концу строки:

grep -E "\-?[[:digit:]]{1,3}\.[[:digit:]]{0,5}$"

Если вы добавите опцию PCRE для -oвозврата только захваченной группы, вы увидите, что ваш пример соответствует и возвращает желаемое совпадение:

grep -oE "(\-?[[:digit:]]{1,3}\.[[:digit:]]{0,5}$)"

-146.17516

Также, чтобы обнаружить совпадения для строк в файле с необязательными конечными пробелами, просто добавьте \s*:

grep -oE "(\-?[[:digit:]]{1,3}\.[[:digit:]]{0,5}\s*$)"

решение2

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

grep -E "\s+-?[[:digit:]]{1,3}\.[[:digit:]]{0,5}"

Это должно сработать, поскольку исключает совпадение в начале строки.

Если ты хочешьтолько4-й столбец, вы можете легко добиться этого с помощью GNU sed:

sed -r 's/^\S+\s+\S+\s+\S+\s+(\S+)(\s.*|)$/\1/'

где \s— любой пробельный символ (пробел, табуляция и различные «подачи» 1 ) и \Sнепробельный символ, или (гораздо более понятным способом) с помощью sed | cut:

sed 's/\s\+/\t/g' | cut -f4

который сначала сжимает все пробелы в одну вкладку, а затем использует cutдля вырезания четвертого столбца. Он также позволяет вам легко выбирать больше столбцов, например, с cut -f1,4и так далее.

1) То есть: перевод страницы, перевод строки, возврат каретки, хотя средний из них обычно интерпретируется sedкак разделитель строк.

Связанный контент