В файле с большим количеством строк я хочу удалить строки, которые начинаются с HERE IT IS
.
Как я могу сделать это, используя только инструменты командной строки?
В файле с большим количеством строк я хочу удалить строки, которые начинаются с HERE IT IS
.
Как я могу сделать это, используя только инструменты командной строки?
Ответы:
Попробуй sed
:
sed -i '/^HERE IT IS/d' <file>
ВНИМАНИЕ: лучше сделать резервную копию при использовании -i
переключателя sed
:
sed -i.bak '/^HERE IT IS/d' <file>
Исходный файл останется таким же, как <file>.bak
и измененный файл <file>
.
sed -i 's/^HERE IT IS/HERE IT IS\n/' <file>
sed '/^HERE IT IS/G' 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
Shell ( bash
, zsh
, ksh
, вероятно , другие). Это немного глупо, но это можно сделать, но другие инструменты лучше.
while IFS= read -r line; do
[[ $line =~ ^"HERE IT IS" ]] || printf "%s\n" "$line"
done < file > newfile
bash
тот сделал меня
printf "%s\n" "$line"
: заключать в кавычки $ line для сохранения пробелов и избегать некоторых проблем с эхом (интерпретация специальных символов и т. д.). и избегает необходимости добавлять --
тоже.
IFS=
и -r
я могу также пройти весь путь и сделать его надежным.
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
[print(l, end = "") for l in open(fil).readlines() if not re.match("HERE IT IS", l)]
но это не намного эффективнее, чем startswith
. Я задавался вопросом, как [print(l, end = "") for l in open(f).readlines() if not l.startswith("HERE IT IS")]
не будет производить вывод в списке.
Вы можете использовать Vim в режиме Ex:
ex -sc 'g/^HERE IT IS/d' -cx file
g
глобальный поиск
d
удалять
x
сохранить и закрыть
vim
вот такvim '+g/^HERE IT IS/d' +wq test.txt