У меня есть сценарий Bash, который записывает данные в файл журнала, а затем вынимаю то, что хочу, используя команду sed
. Это дает мне файл data.txt
. То, что я хочу знать, это как я могу удалить конкретную строку внутри этого файла data.txt
.
Например:
123
456
789
Я хочу удалить 2-ю строку, содержащую 456
, чтобы у меня было только
123
789
Я пытался с sed '2d' data.txt
, но это не не работает.
Я использую эту команду для создания data.txt
из log.log
:
sed -nE '1s/.{1}(.{2}).*/\1/p;' log.log >> data.txt
Попробуйте это. Это должно сработать.
sed -i '2d' data.txt
Вы должны добавить флаг -i
с помощью команды sed, если вы не перенаправляете свой вывод в новый файл. Если вы не добавите флаг -i
, sed распечатает пространство шаблона в STDOUT и не внесет никаких изменений в исходный файл.
Параметр автоматического резервного копирования
Изменение файла довольно опасно без надлежащего резервного копирования. Таким образом, у sed есть собственный метод резервного копирования файла перед редактированием, который является опцией -i.bak
.
Таким образом, в приведенном выше примере, если мы используем параметр резервного копирования, команда будет.
sed -i.bak '2d' data.txt
Таким образом, он удалит первую строку из файла data.txt, а также создаст резервную копию исходного файла с расширением .bak
.
Вы знаете, помимо указания по номеру строки, вы также можете сделать это путем сопоставления содержимого строки, если это более полезно (что звучит так, как может):
sed -i '/^456$/d' data.txt
Используя awk
:
awk 'NR!=2{ print }' input-file > output-file
. Это можно прочитать следующим образом: если номер записи не равен 2, то распечатать запись (строку). Если вы хотите удалить вторую и третью строку:
awk 'NR!=2 && NR!=3 { print }' input-file
Если вы хотите иметь пустую строку, как показано в вопросе, команда sed
должна выглядеть следующим образом:
sed '2 s/^.*$//' input-file
Первый символ 2
- это номер строки, за которым следует команда s
, которая заменит все символы .*
от начала ^
до конца $
. строки с пустой строкой //
. В этом случае начальный и конечный символы могут быть опущены.
Пример:
$ cat input-file
123
456
789
654
$ sed '2,3 s/.*//' input-file
123
654
Эта команда удалит строки 2-4 и 6
sed -e '2,4d;6d' file
.