удалить строки в файле, не соответствующие шаблону - PullRequest
0 голосов
/ 09 ноября 2018

Я пытаюсь перенести данные, которые состоят из множества отдельных текстовых файлов. Один шаг - удалить все строки в текстовых файлах, которые больше не используются. Строки являются парами ключ-значение. Я хочу удалить все в файле, кроме тех строк с определенными ключами. Я не знаю порядок ключей внутри файла.

Ключи, которые я хочу сохранить, например, версия, дата и номер.

Я нашел этот вопрос Удалите все строки, кроме наилучшей практики соответствия строк шаблона (sed) и попробовал принятый ответ. Моя команда sed -

sed '/^(version=.*$)|(date=.*$)|(number=.*$)/!d' file.txt

с! D после адреса для удаления всех строк, НЕ соответствующих шаблону.

Пример регулярного выражения: https://regex101.com/r/LKfxpP/2

но он продолжает удалять все строки в моем файле. Где моя ошибка? Я предполагаю, что я не прав с моим регулярным выражением, но в чем здесь ошибка?

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Использование awk:

awk -F= '$1 !~ /version|date|number/' file.txt

Разделитель полей установлен на =, и первое поле не должно соответствовать данной строке.

0 голосов
/ 09 ноября 2018

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

sed '/^\(version\|date\|number\)=/!d' file.txt > newfile.txt

Шаблон BRE POSIX здесь соответствует

  • ^ - начало строки
  • \(version\|date\|number\) - сопоставление группы
    • version - version строка
    • \| - или
    • date - date строка
    • \| - или
    • number - number строка
  • = - = char.

Или используйте синтаксис POSIX ERE с опцией -E:

sed -E '/^(version|date|number)=/!d' file.txt > newfile.txt

Здесь оператор чередования | и захват скобок не нуждаются в экранировании.

См. онлайн демо .

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