Как найти линии, соответствующие шаблону, и удалить их?
В файле с большим количеством строк я хочу удалить строки, начинающиеся с HERE IT IS
,
Как я могу сделать это, используя только инструменты командной строки?
7 ответов
Пытаться sed
:
sed -i '/^HERE IT IS/d' <file>
ВНИМАНИЕ: лучше сделать резервную копию при использовании -i
переключатель sed
:
sed -i.bak '/^HERE IT IS/d' <file>
Исходный файл останется как <file>.bak
и измененный файл будет <file>
,
В дополнение к очень хорошему grep
а также sed
ответы, которые вы получили, вот некоторые другие инструменты, которые могут сделать то же самое:
Несколько способов Perl:
perl -ne '/^HERE IT IS/ || print' file > newfile perl -ne 'print if !/^HERE IT IS/' file > newfile perl -ne 'print unless /^HERE IT IS/' file > newfile
Вы можете добавить
-i
перейдите к любому из примеров, чтобы отредактировать файл на месте:perl -i.bak -ne '/^HERE IT IS/ || print' file
(Г) AWK
awk '!/^HERE IT IS/' file > newfile
Более новые версии (4.1.1 и позже) GNU
awk
(по умолчаниюawk
в Linux) также можно редактировать файл на месте:gawk -i inplace '!/^HERE IT IS/' file
Ракушка (
bash
,zsh
,ksh
возможно другие). Это немного глупо, но это можно сделать, но другие инструменты лучше.while IFS= read -r line; do [[ $line =~ ^"HERE IT IS" ]] || printf "%s\n" "$line" done < file > newfile
Я хотел бы использовать grep
отфильтровать их. Например:
grep -v "^HERE IT IS" infile > outfile
Затем переместите выход обратно в путь.
sed
это определенно путь.
Эта небольшая модификация команды @heemayl дала вам удаление строки, независимо от того, используется ли тот же случай в шаблоне или нет, из-за I в ссылке на шаблон.
sed -i '/HERE IT IS/Id' <file>
Если у вас есть несколько файлов в каталоге, для которого вы хотите сделать это, вы можете объединить это с find как так.
find . -maxdepth 1 -type f -exec sed -i.bak '/HERE IT IS/Id' {} +
Опция maxdepth означает, что это не будет повторяться в каталогах.
Другой вариант с питоном:
#!/usr/bin/env python3
[print(l, end = "") for l in open(f).readlines() if not l.startswith("HERE IT IS")]
Где f - путь к файлу между кавычками.
Grep
grep -P '^(?!HERE IT IS)' file
(?!HERE IT IS)
утверждение с отрицательным прогнозом, которое заставляет механизм регулярных выражений совпадать со всей границей начала строки (которая обычно соответствует^
) только если за ним не следует строка HERE IT IS
питон
#!/usr/bin/python3
import sys
fil = sys.argv[1]
with open(fil) as f:
for line in f:
if not line.startswith('HERE IT IS'):
print(line, end="")
Сохраните скрипт в файле, скажем script.py
и затем запустите его с помощью приведенной ниже команды на терминале.
python3 script.py infile
Вы можете использовать Vim в режиме Ex:
ex -sc 'g/^HERE IT IS/d' -cx file
g
глобальный поискd
удалятьx
сохрани и закрой