Я должен скопировать номер 795 и использовать его в другом файле. Этот 795 может быть любым числом и может меняться от файла к файлу. Все до тех пор, пока предприятия не останутся прежними, даже концевые фигурные скобки. Так что это
OBJECT IDENTIFIER ::= { enterprises 795 }
придет это в другом файле
VAR="759"
Я хочу сделать это в SED или Grep . Спасибо за вашу помощь!
Используя 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)" )
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
или независимо от того, что число там).