Извлечь текстовый блок между слешами - PullRequest
0 голосов
/ 17 октября 2018

У меня есть файл с таким содержимым:

/interface bridge
add comment="Bridge VLAN18" fast-forward=no mtu=1500 name=\
    bridge-vlan18 protocol-mode=none
/interface ethernet
set [ find default-name=ether3 ] comment="Ether3" \
    name=cobre
set [ find default-name=ether5 ] comment="Ether5" disabled=\
    yes name=cobre2
/interface bridge port
add bridge=bridge-vlan18 interface=vlan18.bonding-ptp3
add bridge=bridge-vlan18 interface=vlan18.ether13
add bridge=bridge-vlan18 interface=vlan18.eoip-funes-vlan18
add bridge=bridge-vlan18 comment="VLAN18" \
    interface=eoip-orono-vlan18 path-cost=20
add bridge=bridge-vlan18 interface=vlan18.bonding-ptp5
/ip firewall connection tracking
    set tcp-established-timeout=10m

Мне нужно извлечь каждый блок текста из "/" в следующий "/", без строки второй косой черты.Я пробовал следующее (чтобы извлечь блок "интерфейсный мост"):

sed -n "/^\/interface\ bridge\s$/,/^\//p" file.txt

Но я получаю:

/interface bridge
add comment="Bridge VLAN18" fast-forward=no mtu=1500 name=\
    bridge-vlan18 protocol-mode=none
/interface ethernet

Мне нужно получить:

/interface bridge
add comment="Bridge VLAN18" fast-forward=no mtu=1500 name=\
    bridge-vlan18 protocol-mode=none

Требуется использовать нативные инструменты linux (grep, sed, awk и т. Д.).Любые предложения, как я могу это сделать?

Ответы [ 5 ]

0 голосов
/ 18 октября 2018

Это может работать для вас (GNU sed):

sed '/^\/interface bridge\s*$/{:a;n;/^\//!ba};d' file

Если строка начинается с /, напечатайте ее и замените ее следующей строкой.Если эта строка не начинается с /, напечатайте ее и повторяйте, пока строка не начнется с /, затем удалите ее.Все остальные строки удалены.

0 голосов
/ 17 октября 2018

С вырезом:

cut -z -d '/' -f -2 file.txt
0 голосов
/ 17 октября 2018

еще awk

$ awk 'f && /^\//{exit} /^\/interface bridge\r?$/{f=1} f' file

/interface bridge
add comment="Bridge VLAN18" fast-forward=no mtu=1500 name=\
    bridge-vlan18 protocol-mode=none

это должно читаться как начать печать с токена /interface bridge и выйти из режима печати и увидеть следующее /

0 голосов
/ 17 октября 2018

Вы можете использовать опцию x в sed.

x: обмен содержимым пробелов и шаблонов.

$ sed -n -e '/\/interface bridge$/,/^\//{x;p}' inputFile

/interface bridge
add comment="Bridge VLAN18" fast-forward=no mtu=1500 name=\
    bridge-vlan18 protocol-mode=none

Примечание,в начале будет добавлена ​​лишняя пустая строка.

ИЛИ это,

$ sed -n -e '/\/interface bridge$/,/^\//{/\/interface ethernet$/d;p}' inputFile
/interface bridge
add comment="Bridge VLAN18" fast-forward=no mtu=1500 name=\
    bridge-vlan18 protocol-mode=none
0 голосов
/ 17 октября 2018

Это называется записью, поэтому в это дает:

awk 'BEGIN{RS="/";ORS=""}/^interface bridge/{print RS $0}' file

Здесь мы определяем встроенные переменные RS как .RS - разделитель записей.Выходной разделитель записей ORS устанавливается в пустую строку, так как каждая запись уже заканчивается символом .

Приведенный выше оператор читает, , если запись начинается с interface bridge, выведитезапись с разделителем записей RS перед ним.

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

awk 'BEGIN{RS="/";ORS=""; FS=" *\n *"}
           ($1=="interface bridge"){print RS $0}' file

Здесь мы также разбиваем запись на поля, которые являются строками в записи.Вышеприведенный оператор гласит: , если первое поле записи равно interface bridge, распечатать запись с разделителем записей RS перед ним.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...