Строка извлечения, начинающаяся с определенного шаблона в sed

Мой входной файл похож на это:

IDno="1"
Name=Jack
Type=Student
IDno="2"
Name=Jill
Type=Teacher

Я использую sed для извлечения всего IDno и типа только, когда тип является студентом.

sed -e '/IDno=/b' -e '/Type=Student/b' d

Это получает меня все строки со студентом типа, но не IDnos.

Я хочу добраться

IDno="1"
Type=Student
IDno="2"

но я добираюсь

Type=Student

Что я делаю неправильно?

3
задан 27 February 2017 в 08:44

4 ответа

egrep может получить несколько строк из файла. Используя канал | как разделитель можно вытянуть столько различных критериев, сколько Вы хотите. egrep эквивалент grep -E. egrep сценарий, найденный в /bin папка с содержанием, указывающим exec grep -E "$@".

Пример:

egrep "IDno=|Type=Student" inputfile

или

grep -E "IDno=|Type=Student" inputfile

Должен произвести:

IDno="1"
Type=Student
IDno="2"

Hope это помогает!

4
ответ дан 1 December 2019 в 13:05

С помощью sed для печати определенных строк проще использовать опцию -n и команду p:

sed -rn '/IDno=|Type=Student/p'

Или:

sed -n -e '/IDno=/p' -e '/Type=Student/p'

Опция -n подавляет вывод, если явно не печатается. Команда p, конечно, печатает совпадающие строки.

4
ответ дан 1 December 2019 в 13:05

Кажется, что оригинальный вопрос задает «извлечь все IDno и тип только тогда, когда type является учеником. » Но выходные данные примера возвращают все строки IDno =, так что это довольно противоречивы ...

Вот ответ, который возвращает IDno и Type только тогда, когда Type = Student.

sed -n 'N;N;/IDno=.*Type=Student/p' filename | grep -v "^Name="

Небольшое объяснение:

  • -n, --quiet, --silent подавить автоматическую печать пространства шаблона
  • N;N; Считывание / добавление следующей строки ввода в пространство шаблона. (дважды)
  • /IDno=.*Type=Student/p найти и amp; печатать из IDno = to Type = Student
  • | grep -v "^Name=" не показывать строку Name =

Мне не нравится sed | grep, но я не слишком уверен, как get sed для повторного поиска в выходных данных, и канал обычно говорит: «Возьми этот вывод и сделай что-нибудь» ... Может также выполнить grep | sed

grep -v "^Name=" t | sed -n 'N;N;/IDno=.*Type=Student/p'
0
ответ дан 1 December 2019 в 13:05
  • awk:

    Установка разделителя полей как =, и печать записей, которые содержат Type=Student как целая запись или IDno как первое поле:

    awk -F= '$1=="IDno" || $0=="Type=Student"'
    
  • perl:

    Печать строк, которые запускаются с IDno сопровождаемый =, или запустите с Type, сопровождаемый a = и конец в Student:

    perl -ne 'print if /^(IDno=|Type=Student$)/'
    

Пример:

% cat file.txt                                  
IDno="1"
Name=Jack
Type=Student
IDno="2"
Name=Jill
Type=Teacher

% awk -F= '$1=="IDno" || $0=="Type=Student"' file.txt
IDno="1"
Type=Student
IDno="2"

% perl -ne 'print if /^(IDno=|Type=Student$)/' file.txt
IDno="1"
Type=Student
IDno="2"
3
ответ дан 1 December 2019 в 13:05

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

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