Linux удалить строку из файла
Обновлено: 21.11.2024
Команда
sed расшифровывается как Stream Editor. Он используется для выполнения основных преобразований текста в Linux.
sed — одна из важных команд, играющая важную роль в манипуляциях с файлами. Его можно использовать для многих целей, некоторые из которых перечислены ниже:
- Чтобы удалить определенные строки, соответствующие заданному шаблону.
- Чтобы удалить определенную строку в зависимости от ее положения в файле.
- Удаление строк с помощью регулярных выражений.
В этой статье перечислены 27 примеров, которые помогут вам освоить команду sed.
Если бы вы могли запомнить эти команды, это сэкономило бы вам много времени, когда вам потребуется выполнять различные административные задачи в ваших проектах.
Кроме того, ознакомьтесь с этой статьей о том, как использовать команду sed для замены совпадающей строки в файле.
Примечание. Поскольку это демонстрационная статья, мы используем команду sed без параметра -i, который аналогичен параметру «пробного запуска» и отображает фактический вывод без внесения каких-либо изменений в файл.
Но если вы хотите удалить строки из исходного файла в реальной среде, используйте параметр -i с командой sed.
Для демонстрации команды sed мы создали файл sed-demo.txt и добавили следующее содержимое с номерами строк для лучшего понимания.
Часть I) Удаление строк в зависимости от позиции в файле
В первой части показано, как использовать команду sed для удаления строк в зависимости от позиции в файле.
1) Как удалить первую строку из файла?
Чтобы удалить первую строку из файла, используйте следующий синтаксис:
Синтаксис:
- N – обозначает N-ю строку в файле.
- d — указывает на удаление строки.
Приведенная ниже команда sed удаляет первую строку из файла sed-demo.txt:
2) Как удалить последнюю строку из файла?
Если вы хотите удалить последнюю строку из файла, используйте следующий синтаксис ($ обозначает последнюю строку файла).
Приведенная ниже команда sed удаляет последнюю строку из файла sed-demo.txt:
Следующая команда sed удаляет первую и последнюю строку из файла:
3) Удаление определенной строки из файла
В этом примере мы удалим третью строку из файла «sed-demo.txt» с помощью команды sed, как показано ниже. Точно так же любую строку можно удалить, введя номер строки вместо цифры 3.
4) Удаление диапазона строк
Команда sed удаляет любой диапазон заданных строк из файла. Нам нужно ввести «минимальный» и «максимальный» номера строк. В приведенном ниже примере удаляются строки от 5 до 7.
5) Как удалить несколько строк
Команда sed способна удалить набор заданных строк.
В этом примере следующая команда sed удалит 1-ю, 5-ю, 9-ю и последнюю строку.
5.a) Удаление строк, отличных от указанного диапазона
Используйте следующую команду sed, чтобы удалить все строки из файла, кроме указанного диапазона строк:
Подробнее;
- ! – Оператор отрицания используется для сохранения указанных строк.
Используйте приведенную ниже команду, чтобы удалить все строки, кроме первой:
Используйте приведенную ниже команду, чтобы удалить все строки, кроме последней:
6) Удаление пустых или пустых строк
Следующая команда sed удалит пустые строки из файла sed-demo.txt.
Часть II) Удаление строк на основе соответствия шаблону
Во второй части показано, как использовать команду sed для удаления строк в файле, соответствующих заданному шаблону.
7) Удаление строк, содержащих шаблон
Следующая команда sed удалит строки, соответствующие шаблону System в файле sed-demo.txt.
8) Удаление строк, содержащих одну из нескольких строк
Следующая команда sed удаляет строки, соответствующие шаблону System или Linux, из файла sed-demo.txt:
9) Удаление строк, начинающихся с определенного символа
Следующая команда sed удалит все строки, начинающиеся с заданного символа. Чтобы продемонстрировать это, я создал еще один файл с именем «sed-demo-1.txt» со следующим содержимым:
Следующая команда sed удаляет все строки, начинающиеся с символа R:
Следующая команда sed удалит строки, начинающиеся с символа R или F:
Следующая команда sed удалит все строки, начинающиеся с символа L и заканчивающиеся системной строкой:
10) Удаление строк, заканчивающихся указанным символом
Следующая команда sed удаляет все строки, которые заканчиваются символом m :
Следующая команда sed удаляет все строки, которые заканчиваются символом x или m :
11) Удаление всех строк, начинающихся с прописных букв
Используйте следующую команду sed, чтобы удалить все строки, начинающиеся с прописной буквы:
12) Удаление совпадающих строк шаблона с указанным диапазоном
Приведенная ниже команда sed удаляет шаблон Linux, только если он присутствует в строках с 1 по 6:
12.a) Удаление только последней строки, если она содержит заданный шаблон
Приведенная ниже команда sed удаляет последнюю строку только в том случае, если она содержит шаблон «openSUSE»
13) Как удалить строки соответствия шаблону, а также следующую строку?
Используйте следующую команду sed, чтобы удалить строку, соответствующую шаблону System, а также следующую строку в файле.
13.a) Удаление строк, начиная с шаблона до последней строки
Приведенная ниже команда sed удаляет строку, соответствующую шаблону «CentOS», а также удаляет все последующие строки до конца файла:
14) Удаление строк, содержащих цифры/цифры
Приведенная ниже команда sed удаляет все строки, содержащие «цифры»:
Приведенная ниже команда sed удаляет все строки, начинающиеся только с цифр:
Приведенная ниже команда sed удаляет все строки, которые заканчиваются цифрами:
15) Удаление строк, содержащих буквы алфавита, из файла
Приведенная ниже команда sed удаляет все строки, содержащие любые буквенные символы.
Заключительные примечания
В этом руководстве мы показали вам несколько примеров удаления строк из файла с помощью команды sed.
Команда Sed для удаления строк. Команду Sed можно использовать для удаления определенных строк, которые соответствуют заданному шаблону или находятся в определенной позиции в файле. Здесь мы увидим, как удалять строки с помощью команды sed на различных примерах.
Следующий файл содержит образец данных, который используется в качестве входного файла во всех примерах:
Команда Sed для удаления строк — на основе позиции в файле
В следующих примерах команда sed удаляет строки в файле, которые находятся в определенной позиции в файле.
<р>1. Удалить первую строку или строку заголовкаОпция d в команде sed используется для удаления строки. Синтаксис удаления строки:
Здесь N обозначает N-ю строку в файле. В следующем примере команда sed удаляет первую строку в файле.
<р>2. Удалить последнюю строку или строку нижнего колонтитула или строку концаСледующая команда sed используется для удаления строки нижнего колонтитула в файле. $ указывает на последнюю строку файла.
<р>3. Удалить определенную строкуЭто похоже на первый пример. Приведенная ниже команда sed удаляет вторую строку в файле.
<р>4. Удалить диапазон строкКоманду sed можно использовать для удаления диапазона строк. Синтаксис показан ниже:
Здесь m и n — минимальное и максимальное количество строк. Команда sed удаляет в файле строки от m до n. Следующая команда sed удаляет строки со 2 по 4:
<р>5. Удалить строки, кроме первой строки или строки заголовкаИспользуйте оператор отрицания (!) с параметром d в команде sed. Следующая команда sed удаляет все строки, кроме строки заголовка.
<р>6. Удалить строки, кроме последней строки или строки нижнего колонтитула <р>7. Удалить строки, отличные от указанного диапазонаЗдесь команда sed удаляет строки, кроме 2-й, 3-й и 4-й.
<р>8. Удалить первую и последнюю строкуВы можете указать список строк, которые хотите удалить, в команде sed с точкой с запятой в качестве разделителя.
<р>9. Удалить пустые строки или пустые строкиЗначок ^$ указывает на команду sed для удаления пустых строк. Однако этот sed не удаляет строки, содержащие пробелы.
Команда Sed для удаления строк — на основе соответствия шаблону
В следующих примерах команда sed удаляет в файле строки, соответствующие заданному шаблону.
<р>10. Удалить строки, начинающиеся с указанного символа^ указывает начало строки. Приведенная выше команда sed удаляет все строки, начинающиеся с символа «u».
<р>11. Удалить строки, которые заканчиваются указанным символом$ указывает на конец строки. Приведенная выше команда удаляет все строки, которые заканчиваются символом 'x'.
<р>12. Удалить строки, написанные прописными или заглавными буквами <р>13. Удалить строки, содержащие шаблон <р>14. Удалить строки, начиная с шаблона до последней строкиЗдесь команда sed удаляет строку, соответствующую шаблону Fedora, а также удаляет все строки до конца файла, которые появляются рядом с этой соответствующей строкой.
<р>15. Удалить последнюю строку, только если она содержит шаблонЗдесь $ указывает на последнюю строку. Если вы хотите удалить N-ю строку, только если она содержит шаблон, то вместо $ поставьте номер строки.
Примечание. Во всех приведенных выше примерах команда sed печатает содержимое файла на терминале unix или linux, удаляя строки. Однако команда sed не удаляет строки из исходного файла. Чтобы удалить строки из самого исходного файла, используйте параметр -i с командой sed.
Если вы не хотите удалять строки из исходного файла, вы можете перенаправить вывод команды sed в другой файл.
Если вам понравилась эта статья, поделитесь ею или нажмите кнопку Google +1.
редактор потоковой передачи (sed) — важный инструмент при работе с анализом и преобразованием текста в системах на базе nix. Он используется для поиска, фильтрации, подстановки текста и манипуляций с текстом, таких как вставка, удаление, замена и поиск в текстовых файлах.
В большинстве дистрибутивов Linux команда sed предустановлена, и вы можете проверить ее с помощью следующих команд, которые покажут двоичное расположение команды и версию.
В этой статье я покажу вам, как удалить строки из файла с помощью команды sed с помощью примера файла, содержащего 7 строк. Я собираюсь использовать этот файл в демонстрационных целях.
Как удалить строку из файла
Чтобы удалить строку из файла, вы можете использовать приведенную ниже команду. Вы должны заменить «N» номером строки, а «d» — удалить строку.
Если вам нужно удалить четвертую строку из файла, вы должны заменить N=4 .
Удалить строку из файла
Как удалить первую и последнюю строку из файла
Вы можете удалить первую строку из файла, используя тот же синтаксис, что и в предыдущем примере. Вы должны указать N=1, чтобы удалить первую строку.
Чтобы удалить последнюю строку из файла, используйте приведенную ниже команду со знаком ($), обозначающим последнюю строку файла.
Удалить первую и последнюю строки из файла
Как удалить диапазон строк из файла
Вы можете удалить диапазон строк из файла. Допустим, вы хотите удалить строки с 3 по 5, вы можете использовать приведенный ниже синтаксис.
- M – номер начальной строки
- N – номер конечной строки.
Чтобы действительно удалить, используйте следующую команду.
Удалить диапазон строк из файла
Вы можете использовать ! символ для отмены операции удаления. Это удалит все строки, кроме заданного диапазона (3-5).
Отменить операцию
Как удалить пустые строки из файла
Чтобы удалить все пустые строки из файла, выполните следующую команду. Важно отметить, что при использовании этой команды пустые строки с пробелами не удаляются. Я добавил пустые строки и пустые строки с пробелами в свой тестовый файл.
Строки с не удаленными пробелами
На изображении выше видно, что пустые строки удаляются, но строки с пробелами не удаляются. Чтобы удалить все строки, включая пробелы, вы можете запустить следующую команду.
Строки с удаленными пробелами
Как удалить строки, начинающиеся со слов в файле
Чтобы удалить строку, начинающуюся с определенного слова, выполните следующую команду, где символ ^ обозначает начало слова, за которым следует само слово.
Чтобы удалить строку, заканчивающуюся определенным словом, выполните следующую команду. Слово, которое нужно удалить, за которым следует символ $, приведет к удалению строк.
Удалить строку, начинающуюся со слов в файле
Как внести изменения непосредственно в файл
Чтобы внести изменения непосредственно в файл с помощью sed, необходимо передать флаг -i, который внесет изменения непосредственно в файл.
Мы подошли к концу статьи. Команда sed будет играть важную роль, когда вы работаете с любыми файлами. В сочетании с другими утилитами Linux, такими как awk и grep, с помощью sed можно делать больше.
Как мне использовать sed для удаления всех строк в текстовом файле, содержащих определенную строку?
20 ответов 20
Чтобы удалить строку и вывести вывод на стандартный вывод:
Непосредственное изменение файла — не работает с BSD sed:
То же самое, но для BSD sed (Mac OS X и FreeBSD) — не работает с GNU sed:
Чтобы напрямую изменить файл (и создать резервную копию) — работает с BSD и GNU sed:
Спасибо, но, похоже, он не стирает его из файла, а просто распечатывает содержимое текстового файла без этой строки.
@A Clockwork: да, вам нужно перенаправить вывод либо в новый файл с чем-то вроде sed '/pattern to match/d' ./infile > ./newfile, или если вы хотите выполнить редактирование на месте затем вы можете добавить флаг -i в sed, как в sed -i '/pattern to match/d' ./infile . Обратите внимание, что флаг -i требует GNU sed и не является переносимым
Для некоторых ароматов sed; Флаг sed "-i" требовал расширения. (например, sed -i.backup '/pattern to match/d' ./infile ). Это помогло мне с правками на месте.
Еще одно замечание для пользователей Mac OS X: по какой-то причине флаг -i требует передачи аргумента, даже если это просто пустая строка, например sed -i '' '/pattern/d' ./infile .
Есть много других способов удалить строки с определенной строкой помимо sed :
Рубин (1.9+)
Оболочка (bash 3.2 и более поздние версии)
Группа GNU
И, конечно же, sed (печать инверсии быстрее, чем фактическое удаление):
как удалить определенную строку с шаблоном, а также строку непосредственно над ней? У меня штраф за тысячи таких строк между разными данными.
В OS/X вариант оболочки не сохраняет начальные пробелы, но вариант grep -v хорошо сработал для меня.
пример sed имеет другое поведение, он только greps! это должно быть что-то вроде sed -n -i '/pattern/!p' file .
Версия grep не работает, если каждая строка соответствует шаблону. Лучше сделать: grep -v "файл шаблона" > temp; mv temp file Это может относиться к некоторым другим примерам в зависимости от возвращаемого значения.
«печать инверсии выполняется быстрее, чем фактическое удаление» — не на моей машине (MacBook Air 2012 г., OS X 10.13.2). Создать файл: seq -f %f 10000000 >foo.txt. sed d: время sed -i '' '/6543210/d' foo.txt реальное 0m9.294s. sed !p: время sed -i '' -n '/6543210/!p' foo.txt реальное 0m13.671s. (Для файлов меньшего размера разница больше.)
Вы можете использовать sed для замены строк в файле. Однако кажется, что это намного медленнее, чем использовать grep для инверсии во второй файл, а затем перемещать второй файл поверх оригинала.
Все равно первая команда на моей машине выполняется в 3 раза дольше.
Мне любопытно, как изменится производительность, если использовать sed '/pattern/d' имя_файла > имя_файла2; mv имя_файла2 имя_файла
(используя /usr/share/dict/words Ubuntu) grep и mv: 0,010 с | sed на месте: 0,197 с | sed и mv: 0,031 с
Легкий способ сделать это с помощью GNU sed:
Полезный совет для тех, кто наткнулся на эту ветку вопросов и ответов и не знаком с написанием сценариев оболочки: короткие параметры подходят для одноразового использования в командной строке, но в сценариях следует отдавать предпочтение длинным параметрам, поскольку они более удобочитаемы.
+1 для флага --in-place. Мне нужно проверить это на файлах, защищенных разрешениями. (нужно выполнить некоторую очистку пользователей.)
Обратите внимание, что параметр long доступен только в GNU sed. Пользователям Mac и BSD для этого потребуется установить gsed.
Еще один совет: если ваше регулярное выражение не соответствует, попробуйте параметр -r (или -E , в зависимости от вашей версии). Это позволяет использовать метасимволы регулярных выражений + , ? , <. >и (. ) .
Это правильный ответ, когда на вашем диске нет места и вы не можете скопировать текст в другой файл. Эта команда делает то, что было поставлено под сомнение?
Вы можете использовать ex (стандартный командный редактор Unix):
- + выполняет указанную команду Ex ( man ex ), так же, как -c, которая выполняет wq (запись и выход)
- g/match/d — команда Ex для удаления строк с заданным соответствием, см. Степень g
Приведенный выше пример представляет собой POSIX-совместимый метод редактирования файла на месте в соответствии с этим постом в Unix.SE и спецификациями POSIX для ex .
Разница с sed заключается в следующем:
sed — это Stream EDitor, а не файловый редактор. BashFAQ
Если вам не нравится непереносимый код, накладные расходы ввода-вывода и некоторые другие нежелательные побочные эффекты. Таким образом, некоторые параметры (такие как in-place/ -i ) являются нестандартными расширениями FreeBSD и могут быть недоступны в других операционных системах.
@kenorb "Накладные расходы ввода-вывода и некоторые другие нежелательные побочные эффекты", не могли бы вы уточнить?AFAIK ex использует временный файл, как и любой другой нормальный инструмент, кроме idk с использованием dd
У меня были проблемы с этим на Mac. Кроме того, мне нужно было сделать это с помощью замены переменных.
sed -i '' "/$pattern/d" $file
где $file – это файл, который необходимо удалить, а $pattern – это шаблон, который необходимо удалить.
Я выбрал '' из этого комментария.
Здесь следует отметить использование двойных кавычек в "/$pattern/d" . Переменная не будет работать, если мы используем одинарные кавычки.
Mac sed требует параметр после -i , поэтому, если вам не нужна резервная копия, вам все равно придется добавить пустую строку: -i ''
Вы также можете использовать это:
Здесь -v будет печатать только шаблон, отличный от вашего (это означает инвертировать совпадение).
Чтобы получить аналогичный результат с помощью grep, вы можете сделать следующее:
Я сделал небольшой бенчмарк с файлом, который содержит примерно 345 000 строк. В этом случае способ с grep примерно в 15 раз быстрее, чем метод sed.
Я пробовал как с настройкой LC_ALL=C, так и без нее, похоже, тайминги существенно не изменились. Строка поиска (CDGA_00004.pdbqt.gz.tar) находится где-то в середине файла.
Вот команды и тайминги:
Я использую платформу Linux (Gentoo). Версия sed — GNU sed v 4.2.2, версия Perl — Perl 5 (не могу сказать, какую версию я использовал во время теста), а grep (GNU) — версия 3.0.
Первая команда редактирует файл(ы) на месте (-i).
Вторая команда делает то же самое, но сохраняет копию или резервную копию исходных файлов, добавляя .bk к именам файлов (.bk можно изменить на что угодно).
Вы также можете удалить диапазон строк в файле. Например, чтобы удалить хранимые процедуры в файле SQL.
sed '/CREATE PROCEDURE.*/,/END ;/d' sqllines.sql
Это удалит все строки между CREATE PROCEDURE и END ;.
Эта команда sed почистила многие файлы sql.
Удалить строки из всех файлов, которые соответствуют совпадению
echo -e "/thing_to_delete\ndd\033:x\n" | vim file_to_edit.txt
На всякий случай, если кто-то захочет сделать это для точного совпадения строк, вы можете использовать флаг -w в grep - w для всего. То есть, например, если вы хотите удалить строки с номером 11, но оставить строки с номером 111:
Это также работает с флагом -f, если вы хотите исключить сразу несколько точных шаблонов. Если «черный список» — это файл с несколькими шаблонами в каждой строке, который вы хотите удалить из «файла»:
Немного вводит в заблуждение. -w, --word-regexp Выбрать только те строки, которые содержат совпадения, образующие целые слова. vs. -x, --line-regexp Выбрать только те совпадения, которые точно соответствуют всей строке. Для шаблона регулярного выражения это похоже на заключение шаблона в скобки, а затем его окружение символами ^ и $.
Как ни странно, принятый ответ на самом деле не отвечает на вопрос напрямую. Вопрос касается использования sed для замены строки, но ответ, похоже, предполагает знание того, как преобразовать произвольную строку в регулярное выражение.
Многие библиотеки языков программирования имеют функцию для выполнения такого преобразования, например,
Но как это сделать в командной строке?
Поскольку это вопрос, ориентированный на sed, одним из подходов может быть использование самого sed:
Читайте также: