Intereting Posts
Всегда отображать энергетический апплет? Пробел цвет фона при достижении конца терминала Использование find -exec как печатать имя файла перед каждой строкой? Почему это «while kill -0 $ PID», а не «до kill -0 $ PID»? Что такое spinlock в Linux? Из оболочки, убивая процесс, если время выполнения настенного стола превышает некоторое заданное значение Внешняя переменная В системах на базе Debian, как мы очищаем файлы конфигурации упаковок, которые уже были удалены? Манипуляция клавишей X и указателем захватывается в командной строке Какие команды или операции можно использовать для установки процессора под интенсивную нагрузку? найти все команды с помощью wh, найти по ключевому слову на странице man Как использовать tmux при запуске как для OSX, так и для Ubuntu (включая Quake) На экране входа в Mint разная раскладка клавиатуры для каждого пользователя Проблема с клавиатурой при работе с Emacs и Openbox Символические ссылки resolvconf от Kali Linux после каждой перезагрузки

Regex to grep filler, за которым следует подписанный float

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

880.952 NAV_Y uSimMarine -146.17516 

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

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

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

Кроме того, он также совпадает с номером в первом столбце.

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

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

У меня нет матчей, которые я не понимаю.

Что мне здесь не хватает?

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

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

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

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

-146,17516

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

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

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

 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 | cut :

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

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

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