Как найти линии, соответствующие шаблону, и удалить их?
В файле с большим количеством строк я хочу удалить строки, начинающиеся с 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сохрани и закрой