Как бы я использовал sed, чтобы удалить все строки в текстовом файле, которые содержат определенную строку?
shell
sed
text-parsing
in-place
Заводной апельсин
источник
источник
sed '/pattern to match/d' ./infile > ./newfile
либо, если вы хотите выполнить редактирование на месте, тогда вы можете добавить-i
флаг в sed, как вsed -i '/pattern to match/d' ./infile
. Обратите внимание, что-i
флаг требует GNU sed и не является переносимымsed -i.backup '/pattern to match/d' ./infile
) Это помогло мне с правками на месте.sed
тем, которые не контролируются версиями.sed -i '' '/pattern/d' ./infile
.Есть много других способов удалить строки с определенной строкой, кроме
sed
:AWK
Рубин (1,9+)
Perl
Shell (Баш 3.2 и позже)
GNU grep
И конечно
sed
(обратная печать выполняется быстрее, чем фактическое удаление):источник
sed
пример имеет различное поведение, он только отбирает! это должно быть что-то вродеsed -n -i '/pattern/!p' file
.grep -v "pattern" file > temp; mv temp file
это может относиться к некоторым другим примерам в зависимости от возвращаемого значения.seq -f %f 10000000 >foo.txt
. sed d:time sed -i '' '/6543210/d' foo.txt
реальный 0m9.294s. sed! p:time sed -i '' -n '/6543210/!p' foo.txt
реальный 0m13.671s. (Для файлов меньшего размера разница больше.)Вы можете использовать sed для замены строк в файле. Тем не менее, это выглядит намного медленнее, чем использование grep для обратного преобразования во второй файл, а затем перемещение второго файла поверх оригинала.
например
или
В любом случае, первая команда на моей машине занимает в три раза больше времени.
источник
sed '/pattern/d' filename > filename2; mv filename2 filename
Самый простой способ сделать это с помощью GNU
sed
:источник
-r
вариант (или-E
, в зависимости от вашей версии). Это позволяет использовать регулярные выражения метасимволов+
,?
,{...}
и(...)
.Вы можете рассмотреть возможность использования
ex
(это стандартный редактор на основе команд Unix):где:
+
выполняет данную команду Ex (man ex
), так же как и-c
выполняющуюсяwq
(запись и выход)g/match/d
- Ex команда для удаления строк с даннымиmatch
, см .: Мощность gПриведенный выше пример представляет собой POSIX-совместимый метод для редактирования файла на месте согласно этому посту в спецификациях Unix.SE и POSIX для
ex
.Разница в
sed
том, что:Если вы не наслаждаетесь непереносимым кодом, накладными расходами ввода / вывода и некоторыми другими плохими побочными эффектами. Поэтому в основном некоторые параметры (например, на месте /
-i
) являются нестандартными расширениями FreeBSD и могут быть недоступны в других операционных системах.источник
man ex
это дает мне человек заvim
это , кажется ,ex
является частью Vim ... если я понял правильно , что означает , что синтаксис шаблона дляmatch
является vimregex.com , который похож , но отличается от POSIX и PCRE вкусов?:g
является POSIX-совместимой командой с некоторыми небольшими отличиями . Я предполагаю, что PCRE был основан на этом.Я боролся с этим на Mac. Плюс, мне нужно было сделать это с помощью замены переменных.
Поэтому я использовал:
sed -i '' "/$pattern/d" $file
где
$file
файл, в котором требуется удаление, и$pattern
шаблон, который необходимо сопоставить для удаления.Я выбрал
''
из этого комментария .Дело в том, чтобы отметить здесь является использование двойных кавычек в
"/$pattern/d"
. Переменная не будет работать, когда мы используем одинарные кавычки.источник
sed
требует параметр после-i
, поэтому, если вы не хотите создавать резервную копию, вам все равно нужно добавить пустую строку:-i ''
sed -i "/$pattern/d" $file
. Спасибо за ваш ответ.Я сделал небольшой тест с файлом, который содержит примерно 345 000 строк. В этом случае путь с
grep
использованием примерно в 15 раз быстрее, чемsed
метод.Я пробовал как с настройкой LC_ALL = C, так и без нее, кажется, что изменения времени существенно не изменились. Строка поиска (CDGA_00004.pdbqt.gz.tar) находится где-то в середине файла.
Вот команды и время:
источник
Вы также можете использовать это:
Здесь
-v
будет печататься только ваш шаблон (это означает инвертированное совпадение).источник
Чтобы получить такой же результат, как
grep
вы, вы можете сделать это:источник
bash
оболочки или аналогичной (неtcsh
).SED:
'/James\|John/d'
-n '/James\|John/!p'
AWK:
'!/James|John/'
/James|John/ {next;} {print}
GREP:
-v 'James\|John'
источник
Первая команда редактирует файл (ы) на месте (-i).
Вторая команда делает то же самое, но сохраняет копию или резервную копию исходного файла (ов), добавляя .bk к именам файлов (.bk можно изменить на что угодно).
источник
echo -e "/thing_to_delete\ndd\033:x\n" | vim file_to_edit.txt
источник
На всякий случай, если кто-то захочет сделать это для точного соответствия строк, вы можете использовать
-w
флаг в grep -w для целого. То есть, например, если вы хотите удалить строки с номером 11, но оставить строки с номером 111:Он также работает с
-f
флагом, если вы хотите исключить несколько точных шаблонов одновременно. Если «черный список» - это файл с несколькими шаблонами в каждой строке, который вы хотите удалить из «файла»:источник
-w, --word-regexp Select only those lines containing matches that form whole words.
против-x, --line-regexp Select only those matches that exactly match the whole line. For a regular expression pattern, this is like parenthesizing the pattern and then surrounding it with ^ and $.
источник
показать обработанный текст в консоли
сохранить обработанный текст в файл
добавить обработанную текстовую информацию в существующий файл
чтобы обработать уже обработанный текст, в этом случае удалите больше строк из того, что было удалено
| more
покажет текст кусков одной страницы за один раз.источник
Вы можете использовать хороший старый ,
ed
чтобы редактировать файл аналогичным образом в ответ , который используетex
. Большая разница в этом случае заключается в том, чтоed
команды принимаются через стандартный ввод, а не как аргументы командной строки, такие какex
can. При использовании его в скрипте, обычный способ приспособиться к этому - использоватьprintf
для передачи ему команд:или с наследственностью:
источник