Это очень часто является признаком антипаттерна. Инструмент, который произвел номера строк, вполне может быть заменен инструментом, который сразу удаляет строки. Например;
grep -nh error logfile | cut -d: -f1 | deletelines logfile
(где deletelines
- нужная вам утилита) - то же, что и
grep -v error logfile
Сказав, что, если вы находитесь в ситуации, когда вам действительно нужно выполнить эту задачу, вы можете сгенерировать простой сценарий sed
из файла номеров строк. Смешно (но, возможно, слегка запутанно) вы можете сделать это с sed
.
sed 's%$%d%' linenumbers
Принимает файл номеров строк, по одному на строку, и выдает на стандартном выходе те же номера строк с d
, добавляемыми после каждого. Это действительный сценарий sed
, который мы можем сохранить в файл или (на некоторых платформах) направить в другой экземпляр sed
:
sed 's%$%d%' linenumbers | sed -f - logfile
На некоторых платформах sed -f
не понимает аргумент опции -
для обозначения стандартного ввода, поэтому вам нужно перенаправить скрипт во временный файл и очистить его, когда вы закончите, или, возможно, заменить одинокий тире с /dev/stdin
или /proc/$pid/fd/1
, если ваша ОС (или оболочка) имеет это.
Как всегда, вы можете добавить -i
перед параметром -f
, чтобы sed
отредактировал целевой файл на месте, вместо получения результата на стандартном выводе. На платформах * BSDish (включая OSX) вам также необходимо указать явный аргумент для -i
; распространенная идиома - предоставить пустой аргумент; -i ''
.