Использование sed для удаления всех строк, которые не соответствуют шаблону - PullRequest
0 голосов
/ 24 октября 2018

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

У меня есть список объектов, как следует из конфигурации fortigate:

config firewall address <--keep line
edit "item1"
next
edit "item2"
next
edit "item3"
next
edit "item4" <--keep line
unset associated-interface <--keep line and use as anchor for one line above and below
next <--keep line
edit "item5" <--keep line
unset associated-interface <--keep line and use as anchor for one line above and below
next <--keep line
edit "item6"
next
end <--keep line

Я пытаюсь получить его, поэтому, когда все это сказано и сделано, я пытаюсь сохранить три строки (item4 и item5) и удалить все остальные строки.Также, если возможно, сохраните первую и последнюю строку.

Ответы [ 3 ]

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

Это, вероятно, не лучший способ сделать это, но я не смог найти другого пути для этого.

Я сузил его до четырех команд, которые вы можете поместить в скрипт bash (заменитеfile.txt с вашим собственным исходным файлом и /tmp/finalFile с любым нужным вам адресатом):

head -n1 file.txt >> /tmp/finalFile
head -n $(echo $(grep -ni item6 file.txt | cut -d: -f1) - 1 | bc) file.txt > /tmp/tmpfile
tail -n $(echo $(wc -l /tmp/tmpfile | awk '{print $1}') - $(grep -n item4 /tmp/tmpfile | cut -d: -f1) + 1 | bc) /tmp/tmpfile >> /tmp/finalFile
tail -n1 file.txt >> /tmp/finalFile

Когда я запускаю вышеуказанные команды, это последний файл в /tmp/finalFile:

config firewall address 
edit "item4" 
unset associated-interface  
next 
edit "item5" 
unset associated-interface 
next 
end 

Некоторое объяснение:

  • Первая строка - это просто верхняя строка, захваченная head, добавленная к finalFile
  • Второй шаг в основном ищет каждыйдо item5 и сохраните его во временном файле.
  • Третий шаг - захват этого временного файла и вычисление количества строк, необходимых для tail, чтобы получить все строки до * 1023.*, не включая его, и захватывает эти строки, добавляя вывод к finalFile.
  • Наконец, последняя строка захватывает последнюю строку из исходного файла с помощью tail и добавляет ее к finalFile
0 голосов
/ 25 октября 2018

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

sed '/config/,/end/!d;/config/b;/end/b;/item4/,+2b;/item5/,+2b;d' file

Удалить все строки не между config и end.Выведите строки, начинающиеся с config или end, а также строки, начинающиеся с item4 или item5 и следующие две строки.

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

Вашему описанию не хватает высокой точности, но здесь идет речь что-то :

sed -n -e '/^config/p;/item[45]/p;/^end/p' forti
config firewall address
edit "item4"
edit "item5"
end

Правка : этот ответ был дан за 2 часа дотребовалось сохранить строки до и после next после item4 и item5 ...

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