Мне нужна помощь У меня есть файл как

sometext line 1
sometext line 2
SU0000 
ID
ID
ID
sometext line 3
sometext line 4
sometext line 5
sometext line 6
SU0000 
ID
ID
ID
sometext line 7
sometext line 8

Я хочу фильтровать текст таким образом, чтобы вывод

sometext line 2
SU0000 
ID
ID
ID
sometext line 6
SU0000 
ID
ID
ID

Другими словами, я хочу получить строку перед шаблоном и все строки после него, начиная с ID.

Я хочу сделать это в седе. Может кто-нибудь помочь, пожалуйста.

1 ответ1

3

Ты не можешь. Это не то, для чего предназначен sed .

Вместо этого вы можете сделать это с помощью grep, если число вхождений идентификатора фиксировано. Если вместо этого он является переменным, вам понадобится что-то более мощное, например, bash или perl-скрипт.

Если число вхождений идентификатора является фиксированным (скажем, 3), то следующая команда

  grep -B 1 -A 3 SU0000 filename.txt

будет делать то, что вам нужно.

РЕДАКТИРОВАТЬ:

если число вхождений SU0000 не фиксировано, следующий скрипт поможет вам, где файл, который нужно проанализировать, называется "данными". Измените его так, как вам лучше.

  #!/bin/bash

  I_INSIDE=0
  PREVIOUS_LINE=""

  while read line; do
    echo $line | grep -e SU0000 2>&1 1>/dev/null
    if [ $? == 0 ]; then
            echo $PREVIOUS_LINE
            echo $line
            I_INSIDE=1
            PREVIOUS_LINE=$line
            continue
    fi
    echo $line | grep -e ID 2>&1 1>/dev/null
    if [ $? == 0 -a $I_INSIDE == 1 ]; then
            echo $line
    else
            I_INSIDE=0
    fi
    PREVIOUS_LINE=$line

  done < data

Это очень элементарный сценарий, позволяющий вам следовать каждой инструкции. это могло быть значительно сжато.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .