Как соответствовать точной строке с помощью 'sed'? Но не часть его.?

Просто используйте makeself, он создает сценарий оболочки с включенным архивом и может выполнить команды после извлечения.

8
03.03.2014, 20:21
7 ответов

Если вы знаете номера строк, которые хотите искать (как предполагает ваш Q), подтяните regex, чтобы не совпадали ненужные строки.

Например, измените:

sed -n '/11/,/14/p' | grep NAME | awk -F "= " '{print $2}'

на

sed -n '/^11 /,/^14 /p' | grep NAME | awk -F "= " '{print $2}'

^ будет соответствовать началу строки, а пробел после номера гарантирует, что будет соответствовать определенный номер строки, и вы не будете обрабатывать ненужные блоки.

3
27.01.2020, 20:09
  • общая версия не основана на номере строки, а на идентификационной ссылке[12146]загрузить весь файл[12147]чистый раздел, не входящий в группу идентификаторов (рекурсивный)[12148]просто взять значение NAME содержимого в группе[12149]распечатать результат[12150]
  • 0
    27.01.2020, 20:09

    Используйте границы слов:

    grep '\bNAME1\b'
    

    будет соответствовать NAME1, а не NAME1XYZ или XYZNAME1.

    Аналогично,

    sed -n '/11\b/,/14\b/p'
    

    не будет соответствовать строкам, содержащим 111 и 142.


    EDIT: Похоже, что номера во входном файле на самом деле являются номерами строк. Если это так, вы можете просто сказать:

    sed '11,14!d'
    

    чтобы получить нужные строки.

    5
    27.01.2020, 20:09

    sed не подходит для этой работы. Используйте awk, где вы можете указать идентификатор, который вы ищете, и распечатать следующее появившееся ИМЯ.

    awk -v id="id2" '
        $NF == id {have_id = 1} 
        have_id && $0 ~ /NAME/ {print $NF; exit}
    ' filename
    
    3
    27.01.2020, 20:09

    Для этого не нужен никакой другой инструмент, sed легко справится с этим целиком.

    sed -nr '/11/,/14/{s/^.*NAME =\s*(\S*).*$/\1/p}' <$infile
    

    Это должно предоставить вам только первую последовательность непробельных символов после фразы «NAME =» для каждой строки, в которой эта фраза находится между строками 11 и 14 любого входного файла sed is кормили.

    4
    27.01.2020, 20:09

    Вы можете использовать AWK

    awk 'NR>=13 && NR<=17 && /NAME/{print $NF}' infile
    

    Это будет искать строки между 13 и 17, затем искать имя, и если совпадение, оно будет печатать последнее слово из Name = LastWord

    4
    27.01.2020, 20:09

    вы можете распечатать те строки, которые содержат совпадающий шаблон, используя sed следующим образом:

    sed -n '/pattern/p'  Filename
    
    • -n - эти параметры отключают эту автоматическую печать, и только sed производит вывод, если явно указано через p команда.

    • p - print

    0
    27.01.2020, 20:09

    Теги

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