У файлі з великою кількістю рядків я хочу видалити рядки, з яких починається 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