Копировать определенный текст из одного файла в другой, используя GREP или SED

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

OBJECT IDENTIFIER   ::=   { enterprises 795 }

придет это в другом файле

VAR="759"

Я хочу сделать это в SED или Grep . Спасибо за вашу помощь!

2
задан 11 June 2015 в 20:41

2 ответа

Используя grep с PCRE (Совместимые с Perl регулярные выражения):

grep -Po '.* \K\d+(?= }$)'
  • .* \K будет соответствовать до пространства перед цифрами и \K отбросит соответствие

  • \d+ будет соответствовать одной или нескольким цифрам

  • Нулевая ширина положительное предвидение (?= }$) гарантирует, что соответствие сопровождается } в конце.

    $ var="$(grep -Po '.* \K\d+(?= }$)' <<<'OBJECT IDENTIFIER ::= { enterprises 795 }')"
    
    $ echo "$var"
    795
    

В случае любого файла (где будет несколько соответствий) лучше сохраняют соответствия как элементы массива так, чтобы можно было выполнить итерации по ним позже:

var=( "$(grep -Po '.* \K\d+(?= }$)' file.txt)" )

Используя sed :

$ sed -r 's/.* ([0-9]+) }/\1/' <<<'OBJECT IDENTIFIER   ::=   { enterprises 795 }'
795
  • -r позволит использованию использовать расширенный Regex

  • .* будет соответствовать до пространства перед цифрами

  • ([0-9]+) будет соответствовать цифрам и помещать соответствие в группу

  • Мы имеем, просто используют группу \1 т.е. цифры как заменяющий шаблон.

В случае любого файла (где будет несколько соответствий) лучше сохраняют соответствия как элементы массива так, чтобы можно было выполнить итерации по ним позже:

var=( "$(sed -nr 's/.* ([0-9]+) }/\1/p' file.txt)" )
2
ответ дан 11 June 2015 в 20:41

grep "OBJECT IDENTIFIER" testfile1.txt | awk '{sub("}","");print $5}'

Объяснение : так как Вы запросили grep, я использую grep для получения строки, которую Вы хотите. Awk печатает 5-й столбец (так как в awk столбцами по умолчанию разделяются пробелами), который будет 795}. sub функция просто заменяет } пробелом. Результат состоит в том, что Вы извлекаете само число.

Примечание : awk может сделать это совершенно отдельно без grep при помощи /SEARCHTERM/ форма. Вот код:

awk ' /OBJECT IDENTIFIER/ {sub("}","");print $5}' testfile1.txt

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

Версия с grep и сокращением

немного более длинная альтернатива первой команде - это: grep "OBJECT IDENTIFIER" testfile1.txt | cut -d '{' -f2 | cut -d'}' -f1 | cut -d' ' -f2

cut команда делает то, на что она походит - сокращения вещей после определенного разделителя. Таким образом, здесь мы находим необходимую строку (вывод существует OBJECT IDENTIFIER ::= { enterprises 795 }), отключите то, что приходит вторым, после '{' (вывод теперь enterprises 795 }), сокращение того, что прибывает прежде '}' (теперь мы имеем enterprises 795) и сокращение второй вещи после '' (пространства) (теперь мы добираемся 795 или независимо от того, что число там).

0
ответ дан 11 June 2015 в 20:41

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

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