Как с помощью sed удалить все строки в текстовом файле, содержащие определенную строку?
Чтобы удалить строку и вывести вывод в стандартный аут:
sed '/pattern to match/d' ./infile
Для прямого изменения файла - не работает с BSD sed:
sed -i '/pattern to match/d' ./infile
То же самое, но для BSD sed (Mac OS X и FreeBSD) - не работает с GNU sed:
sed -i '' '/pattern to match/d' ./infile
Для прямого изменения файла (и создания резервной копии) - работает с BSD и GNU sed:
sed -i.bak '/pattern to match/d' ./infile
Существует множество других способов удаления строк с определенной строкой, кроме sed
:
awk '!/pattern/' file > temp && mv temp file
ruby -i.bak -ne 'print if not /test/' file
perl -ni.bak -e "print unless /pattern/" file
while read -r line
do
[[ ! $line =~ pattern ]] && echo "$line"
done <file > o
mv o file
grep -v "pattern" file > temp && mv temp file
И, конечно, sed
(печать инверсии быстрее, чем фактическое удаление):
sed -n '/pattern/!p' file
Вы можете использовать sed для замены строк на месте в файле. Однако это кажется намного медленнее, чем использование grep для обратного переноса во второй файл и последующего перемещения второго файла поверх оригинального.
Например.
sed -i '/pattern/d' filename
или
grep -v "pattern" filename > filename2; mv filename2 filename
Первая команда в любом случае занимает в 3 раза больше времени на моей машине.
Самый простой способ сделать это, с GNU СЭД
:
sed --in-place '/some string here/d' yourfile
Вы можете использовать экс
(который является стандартным интерфейсом командной строки в Unix-редактор):
ex +g/match/d -cwq file
где:
+
выполняет заданную команду экс (человек экс
), как -С
, который выполняет ВК
(записать и выйти)Приведенный выше пример-это POSIX-совместимая способ для редактирования файл в это сообщение в Unix.ЮВ]3 и в POSIX спецификации для бывших
.
Разница с СЭД
заключается в том, что:
СЭД
является овtream Эдитор, не редактор файл.<суп>BashFAQ</SUP и ГТ;
Если вы не любите код непереносимыми, ввода/вывода и некоторые другие побочные эффекты. Так что в принципе некоторые параметры (такие как/-я
) являются нестандартные расширения FreeBSD и не может быть доступна для других операционных систем.
Я боролся с этим на Mac. Плюс, мне нужно сделать это с помощью замены переменной.
Так что я использовал:
сед-я '' " у/$рисунком/Д" в файл $
где файл $
- это файл, где необходимо удаление и `$шаблон является шаблоном для удаления.
Я выбрал''
из этого комментарий.
Вещь, чтобы отметить здесь заключается в использовании двойных кавычек* в в "/$рисунком/Д"
в. Переменная выиграл'т работу, когда мы используем одиночные кавычки.
Я сделал небольшой тест с файлом, который содержит около 345 000 строк. Кстати с Команда grep
кажется, что будет примерно в 15 раз быстрее, чем метод СЭД
в этом случае.
Я пробовал и С и без параметра значение lc_all=C, он не кажется существенно изменить тайминги. Строку поиска (CDGA_00004.pdbqt.ГЗ.смола) где-то в середине файла.
Вот команды и тайминги:
time sed -i "/CDGA_00004.pdbqt.gz.tar/d" /tmp/input.txt
real 0m0.711s
user 0m0.179s
sys 0m0.530s
time perl -ni -e 'print unless /CDGA_00004.pdbqt.gz.tar/' /tmp/input.txt
real 0m0.105s
user 0m0.088s
sys 0m0.016s
time (grep -v CDGA_00004.pdbqt.gz.tar /tmp/input.txt > /tmp/input.tmp; mv /tmp/input.tmp /tmp/input.txt )
real 0m0.046s
user 0m0.014s
sys 0m0.019s
СЭД:
На awk:
Команда grep:
perl -i -nle'/regexp/||print' file1 file2 file3
perl -i.bk -nle'/regexp/||print' file1 file2 file3
Первая команда редактирует файл(ы) на месте (-я).
Вторая команда делает то же самое, но сохраняет копию или резервную копию оригинального файла(ов) путем добавления .БК к именам файлов (.БК можно изменить на что угодно).
cat filename | grep -v "pattern" > filename.1
mv filename.1 filename
Просто в случае если кто-то хочет сделать это для точного совпадения строк, вы можете использовать -з
флаг в grep - W для всего. То есть, например, если вы хотите удалить строки с номером 11, но держать линии с номером 111:
-bash-4.1$ head file
1
11
111
-bash-4.1$ grep -v "11" file
1
-bash-4.1$ grep -w -v "11" file
1
111
Он также работает с флагом -Ф
, если вы хотите исключить несколько точных моделей сразу. Если ты такой "черного списка" это файл с нескольких моделей в каждой строке, что вы хотите избавиться от "файл":
grep -w -v -f blacklist file