У меня есть сценарий Bash, который записывает данные в файл журнала, а затем из этого я извлекаю вещи, которые я хочу использовать командой sed. Это дает мне файл data.txt. Я хочу знать, как я могу удалить определенную строку внутри этого файла data.txt.
Например:
123
456
789
Я хочу удалить вторую строку, содержащую 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 '2d' data.txt
Вы должны добавить флаг -i с командой sed, если вы не перенаправляете свой вывод на новый файл. Если вы не добавляете флаг -i, sed будет печатать пространство шаблонов в STDOUT и не будет вносить никаких изменений в исходный файл.
Опция автоматического резервного копирования
довольно опасно модифицировать файл без надлежащей резервной копии. Таким образом, sed имеет свой собственный способ резервного копирования файла перед редактированием, который является -i.bak.
Итак, в приведенном выше примере, если мы используем опцию резервного копирования, команда будет.
sed -i.bak '2d' data.txt
Таким образом, он удалит первую строку из файла data.txt и также сделает резервную копию исходного файла с расширением .bak.
Попробуйте это. Это должно работать.
sed -i '2d' data.txt
Вы должны добавить флаг -i с командой sed, если вы не перенаправляете свой вывод на новый файл. Если вы не добавляете флаг -i, sed будет печатать пространство шаблонов в STDOUT и не будет вносить никаких изменений в исходный файл.
Параметр автоматического резервного копирования
довольно опасно модифицировать файл без надлежащей резервной копии. Таким образом, sed имеет свой собственный способ резервного копирования файла перед редактированием, который является -i.bak.
Итак, в приведенном выше примере, если мы используем опцию резервного копирования, команда будет.
sed -i.bak '2d' data.txt
Таким образом, он удалит первую строку из файла data.txt и также сделает резервную копию исходного файла с расширением .bak.
Использование 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
Вы знаете, помимо указания номера строки, вы также можете сделать это, сопоставляя содержимое строки, если это более полезно (что звучит так, как могло):
sed -i '/^456$/d' data.txt
Эта команда удалит строки 2-4 и 6
sed -e '2,4d;6d' file
Вы знаете, помимо указания номера строки, вы также можете сделать это, сопоставляя содержимое строки, если это более полезно (что звучит так, как могло):
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
Вы знаете, помимо указания номера строки, вы также можете сделать это, сопоставляя содержимое строки, если это более полезно (что звучит так, как могло):
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