У файлі з великою кількістю рядків я хочу видалити рядки, з яких починається 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зробив мене LOL)
printf "%s\n" "$line": цитуючи $ line, щоб зберегти пробіли та уникати деяких ехо-проблем (інтерпретація спеціальних символів тощо). і уникає необхідності додавати --теж.
IFS=і -r, я можу також пройти весь шлях і зробити його стійким.
sed це, безумовно, шлях.
Ця незначна модифікація команди @heemayl дала вам видалити рядок, незалежно від того, чи використовується той самий випадок у шаблоні чи ні, через I у посиланні на шаблон.
sed -i '/HERE IT IS/Id' <file>
Якщо у вас було декілька файлів у каталозі, на якому ви хотіли це зробити, ви можете комбінувати його з таким чином знайти.
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 -P '^(?!HERE IT IS)' file
(?!HERE IT IS)негативне твердження lookahead, яке змушує механізм регулярного вирівнювання відповідати всій початковій межі лінії ( яка зазвичай відповідає^ ), лише якщо за нею не йде рядок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