Как удалить определенные строки из текстового файла

У меня есть сценарий 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
4
задан 4 January 2018 в 23:07

4 ответа

Попробуйте это. Это должно сработать.

sed -i '2d' data.txt

Вы должны добавить флаг -i с помощью команды sed, если вы не перенаправляете свой вывод в новый файл. Если вы не добавите флаг -i, sed распечатает пространство шаблона в STDOUT и не внесет никаких изменений в исходный файл.

Параметр автоматического резервного копирования

Изменение файла довольно опасно без надлежащего резервного копирования. Таким образом, у sed есть собственный метод резервного копирования файла перед редактированием, который является опцией -i.bak.

Таким образом, в приведенном выше примере, если мы используем параметр резервного копирования, команда будет.

sed -i.bak '2d' data.txt

Таким образом, он удалит первую строку из файла data.txt, а также создаст резервную копию исходного файла с расширением .bak.

7
ответ дан 4 January 2018 в 23:07

Вы знаете, помимо указания по номеру строки, вы также можете сделать это путем сопоставления содержимого строки, если это более полезно (что звучит так, как может):

sed -i '/^456$/d' data.txt
6
ответ дан 4 January 2018 в 23:07

Используя 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
3
ответ дан 4 January 2018 в 23:07

Эта команда удалит строки 2-4 и 6

sed -e '2,4d;6d' file
.
2
ответ дан 4 January 2018 в 23:07

Другие вопросы по тегам:

Похожие вопросы: