В файле с большим количеством строк я хочу удалить строки, который запускается с HERE IT IS
.
Как я могу сделать эту использующую только командную строку инструменты?
Попробуйте sed
:
sed -i '/^HERE IT IS/d' <file>
ПРЕДУПРЕЖДЕНИЕ: лучше для взятия резервного копирования при использовании -i
переключатель sed
:
sed -i.bak '/^HERE IT IS/d' <file>
исходный файл останется как <file>.bak
, и измененный файл будет <file>
.
Я использовал бы grep
для фильтрования их. Например:
grep -v "^HERE IT IS" infile > outfile
Тогда кладут обратно outfile к infile.
sed
определенно способ пойти.
Эта небольшая модификация команды @heemayl дала Вам, удалит строку, используется ли тот же случай в шаблоне или нет, из-за меня в ссылке шаблона.
sed -i '/HERE IT IS/Id' <file>
, Если у Вас было несколько файлов в каталоге, на котором Вы хотели сделать это, Вы могли объединить его с находкой как так.
find . -maxdepth 1 -type f -exec sed -i.bak '/HERE IT IS/Id' {} +
maxdepth опция означает, что это не рекурсивно вызовет в каталоги.
Другая опция Python:
#!/usr/bin/env python3
[print(l, end = "") for l in open(f).readlines() if not l.startswith("HERE IT IS")]
, Где f является путем к файлу между кавычками.
Можно использовать Vim в режиме Ex:
ex -sc 'g/^HERE IT IS/d' -cx file
g
глобальный поиск
d
удаляет
x
, сохраняют и закрываются
В дополнение к очень хорошему 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
(g) 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
Grep
grep -P '^(?!HERE IT IS)' file
(?!HERE IT IS)
отрицательное предварительное утверждение, которое делает regex механизм для соответствия всей строке стартовая граница (который обычно подбирается ^
) только если это не сопровождается строкой HERE IT IS
Python
#!/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