Как я могу использовать команду grep для извлечения строки, которая является следующей строкой хватания строки?

У меня есть текстовый файл как (определенная часть целого файла);

!        lat             long          elev (m)
!      44.5199005      11.6468000       50.4276

Я должен извлечь вторую строку и сохранить их в другом текстовом файле. Числа являются переменными и"!" синтаксис, также несколько раз существуют в тексте. Для первой строки всегда существует 8 пробелов между"!" и "lat", но дело обстоит не так для второй строки. Есть ли любая команда, доступная, чтобы позволить мне извлекать следующую строку после grep "! lat" text

5
задан 23 October 2015 в 00:53

3 ответа

Вы можете использовать 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 местам.

8
ответ дан 23 November 2019 в 08:44
  1. awk

    awk '/! {8}lat/ {a=1; next} a {a=0; print};' foo
    
  2. sed

    sed -n '/! \{8\}lat/{n;p}' foo
    
1
ответ дан 23 November 2019 в 08:44

Можно получить желаемый вывод сразу 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
4
ответ дан 23 November 2019 в 08:44

Другие вопросы по тегам:

Похожие вопросы: