Администрирование FreeBSD, Linux, ... Как удалить в файле строки с определенным содержанием? Sat, October 12 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.

Как удалить в файле строки с определенным содержанием? Печать
Добавил(а) microsin   

В этом руководстве (перевод статьи [1]) мы рассмотрим, как избирательно удалять строки из файла, в которых находится определенное содержание, с помощью команд Linux: awk, grep и sed. Попутно мы обсудим их сходство и различия.

Для экспериментов создадим файл myfile.txt:

Baeldung is focused on the Java ecosystem, helping developers learn to implement better, more secure web applications with Spring.

We can find many articles and tutorials on the website.

Baeldung offers a great range of Java tutorials.

The HttpClient Series contain very useful examples.

Please let us know if you have any question regarding the tutorial.

В последующих секциях мы будем запускать различные команды, которые удалят строки, содержащие "Baeldung".

[Удаление определенных строк с помощью grep]

Программа grep это одна из самых известных утилит для обработки текста на операционных системах семейства Linux. Она позволяет производить поиск шаблонов текста в файлах, и выводить в консоль найденные совпадения.

В нашем случае необходимо печатать те строки, которые не совпали, для этого будем использовать опцию -v, которая инвертирует результат работы grep. Т. е. будут выведены только те строки, с которыми шаблон поиска не совпал:

$ grep -v "Baeldung" myfile.txt > tmpfile && mv tmpfile myfile.txt

В этой строке последовательно выполняется сразу 2 команды с помощью оператора && (см. [3], вопрос Q046). Первая команда grep -v "Baeldung" myfile.txt > tmpfile создает временный файл tmpfile, в котором не содержатся строки "Baeldung". Вторая команда переименовывает сгенерированный файл tmpfile в исходный файл myfile.txt. В результате файл myfile.txt будет перезаписан, и в нем окажутся удаленными все строки, где содержится "Baeldung":

$ cat myfile.txt
We can find many articles and tutorials on the website. 

The HttpClient Series contain very useful examples.

Please let us know if you have any question regarding the tutorial.

[Удаление определенных строк с помощью awk]

Команда awk встроена в операционную систему Linux, и описывается как язык сценариев (scripting language). Это очень мощный инструмент, предоставляющий многие функции для различных операций над входными данными.

В этом примере мы будем использовать простое регулярное выражение, чтобы команда awk выдала нам ожидаемый результат. Используя шаблон /Baeldung/, мы обеспечим совпадение с любой строкой, содержащей "Baeldung". С помощью символа восклицательного знака (!) мы укажем инверсию условия, чтобы получить то, что необходимо:

$ awk '!/Baeldung/' myfile.txt > tmpfile && mv tmpfile myfile.txt

Техника здесь та же самая, что и с утилитой grep: на промежуточном шаге создается временный файл, который перезапишет исходный файл.

Утилита gawk. Поскольку GNU awk (gawk) является широко используемой реализацией awk, стоит упомянуть, что мы можем использовать её расширение inplace для редактирования файла по месту, если наша версия gawk 4.1.0 или более свежая:

$ gawk -i inplace '!/Baeldung/' myfile.txt

Благодаря расширению inplace утилиты gawk нам не нужно вручную перенаправлять обработку файла с помощью дополнительной команды mv.

[Удаление определенных строк с помощью sed]

До сих пор мы научились удалять строки, содержащие определенную строку с командами grep и awk. Также мы также можем решить проблему с помощью команды sed.

У команды sed есть опция -i, которая позволяет редактировать файлы по месту (in-place). Опция -i принимает опциональный аргумент расширения в случае, если мы хотим сохранить оригинальный файл как резервную копию (backup) с этим расширением. Если расширение не указано, то резервная копия не будет создана:

$ sed -i '/Baeldung/d' myfile.txt

В этой команде мы сопоставляем строки, используя regex-выражение /Baeldung/, а затем удаляем соответствующие строки, используя оператор d. Если мы проверим наш файл сейчас, то увидим, что строки, содержащие "Baeldung", были удалены.

[Ссылки]

1. Delete Lines in a Text File That Contain a Specific String site:baeldung.com.
2. Использование команды history.
3Ubuntu FAQ.

 

Добавить комментарий


Защитный код
Обновить

Top of Page