У меня есть текстовый файл как (определенная часть целого файла);
! lat long elev (m)
! 44.5199005 11.6468000 50.4276
Я должен извлечь вторую строку и сохранить их в другом текстовом файле. Числа являются переменными и"!" синтаксис, также несколько раз существуют в тексте. Для первой строки всегда существует 8 пробелов между"!" и "lat", но дело обстоит не так для второй строки. Есть ли любая команда, доступная, чтобы позволить мне извлекать следующую строку после grep "! lat" text
Вы можете использовать grep -A1 'expression'
Из руководства:
-A num
--after-context=num
Print num lines of trailing context after matching lines.
<час> В Вашем случае:
grep -A1 "! lat" foo | grep -v "! lat"
должен работать, чтобы извлечь вторую линию только.
Примечание:
Вы можете использовать grep -P '^! {8}lat'
вместо того, чтобы печатать многих . Это менее подвержено ошибкам.
-P
флаг позволяет регулярные выражения стиля жемчуга и {8}
(Есть пространство перед '{'), соответствует точно 8 местам.
awk
awk '/! {8}lat/ {a=1; next} a {a=0; print};' foo
sed
sed -n '/! \{8\}lat/{n;p}' foo
Можно получить желаемый вывод сразу grep
использование -z
опция рассматривать строки входного файла, который будет разделен символами NUL, а не символами новой строки так, чтобы символы новой строки могли быть подобраны буквально. Можно сделать:
grep -Pzo '!\s{8}lat[^\n]*\n\K[^\n]+' file.txt
-P
позволит нам использовать PCRE, -o
получит нас желаемая часть только
!\s{8}lat[^\n]*\n
будет соответствовать строке lat
после !
и 8 пробелов, также это будет соответствовать запаздывающему символу новой строки, \K
отбросит это соответствие
[^\n]+
будет затем соответствовать следующей строке т.е. что мы хотим, как произведено.
Здесь я также предполагаю, что нет никакого пространства после lat
, если должно быть, по крайней мере, пространство, можно сделать:
grep -Pzo '!\s{8}lat\s+[^\n]*\n\K[^\n]+' file.txt
Пример:
$ cat file.txt
! lat long elev (m)
! 44.5199005 11.6468000 50.4276
! 30.5199005 2445.6468000 23.89
$ grep -Pzo '!\s{8}lat[^\n]*\n\K[^\n]+' file.txt
! 44.5199005 11.6468000 50.4276