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

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

12 ответов

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

sed -i '2d' data.txt

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

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

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

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

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

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

6
ответ дан 22 May 2018 в 15:45

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

sed -i '2d' data.txt

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

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

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

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

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

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

6
ответ дан 17 July 2018 в 23:53

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

sed -i '2d' data.txt

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

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

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

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

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

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

6
ответ дан 24 July 2018 в 17: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
ответ дан 22 May 2018 в 15:45

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

sed -i '/^456$/d' data.txt
3
ответ дан 22 May 2018 в 15:45

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

sed -e '2,4d;6d' file
2
ответ дан 22 May 2018 в 15:45
  • 1
    'sed: -e выражение # 1, char 3: missing command' Я получаю эту ошибку, я использую только sed -e '2,3' файл – Insanebench420 4 January 2018 в 16:19
  • 2
    @ Insanebench420, это работает для меня, также работает пример из вашего вопроса sed '2d'. Какова ваша версия Ubuntu? – pa4080 4 January 2018 в 16:24
  • 3
    вы не можете использовать команду, как вы это делали (sed -e '2,3'), после номера строки вы должны иметь «d». Если вы хотите указать диапазон 2-34, используйте «2,34d». Если вы хотите просто удалить строки 2 и 34, используйте «2d, 34d», – Petr 4 January 2018 в 16:26
  • 4
    @Petr, который, вероятно, должен быть 2d;34d (а не запятой). – JoL 4 January 2018 в 23:20
  • 5
    @JoL Жаль, что ты был прав :) Я не могу сейчас его редактировать. – Petr 5 January 2018 в 22:14

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

sed -i '/^456$/d' data.txt
3
ответ дан 17 July 2018 в 23:53

Использование 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
ответ дан 17 July 2018 в 23:53

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

sed -e '2,4d;6d' file
2
ответ дан 17 July 2018 в 23:53

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

sed -i '/^456$/d' data.txt
3
ответ дан 24 July 2018 в 17: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
ответ дан 24 July 2018 в 17:07

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

sed -e '2,4d;6d' file
2
ответ дан 24 July 2018 в 17:07
  • 1
    'sed: -e выражение # 1, char 3: missing command' Я получаю эту ошибку, я использую только sed -e '2,3' файл – Insanebench420 4 January 2018 в 16:19
  • 2
    @ Insanebench420, это работает для меня, также работает пример из вашего вопроса sed '2d'. Какова ваша версия Ubuntu? – pa4080 4 January 2018 в 16:24
  • 3
    вы не можете использовать команду, как вы это делали (sed -e '2,3'), после номера строки вы должны иметь «d». Если вы хотите указать диапазон 2-34, используйте «2,34d». Если вы хотите просто удалить строки 2 и 34, используйте «2d, 34d», – Petr 4 January 2018 в 16:26
  • 4
    @Petr, который, вероятно, должен быть 2d;34d (а не запятой). – JoL 4 January 2018 в 23:20
  • 5
    @JoL Жаль, что ты был прав :) Я не могу сейчас его редактировать. – Petr 5 January 2018 в 22:14

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

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