W pliku z dużą ilością linii chcę usunąć linie zaczynające się od HERE IT IS
.
Jak mogę to zrobić przy użyciu tylko narzędzi wiersza polecenia?
command-line
text-processing
micgeronimo
źródło
źródło
vim
takiegovim '+g/^HERE IT IS/d' +wq test.txt
Odpowiedzi:
Spróbuj
sed
:OSTRZEŻENIE: Lepiej zrobić kopię zapasową, używając
-i
przełącznikased
:Oryginalny plik pozostanie taki, jak
<file>.bak
zmodyfikowany plik<file>
.źródło
sed -i 's/^HERE IT IS/HERE IT IS\n/' <file>
sed '/^HERE IT IS/G' file
.Oprócz bardzo dobrych
grep
i otrzymanychsed
odpowiedzi, oto kilka innych narzędzi, które mogą zrobić to samo:Kilka sposobów Perla:
Możesz dodać
-i
przełącznik do dowolnego z przykładów, aby edytować plik w miejscu:(gapić się
Nowsze wersje (4.1.1 i nowsze) GNU
awk
(domyślnieawk
w Linuksie) mogą również edytować plik w miejscu:Shell (
bash
,zsh
,ksh
, prawdopodobnie inne). Jest to trochę głupie, można to zrobić, ale inne narzędzia są lepsze.źródło
bash
sprawiła, że mnie LOL)printf "%s\n" "$line"
: cytując $ line, aby zachować białe spacje i uniknąć niektórych problemów z echami (interpretacja specjalnych znaków itp.). i unika potrzeby dodawania--
.IFS=
i-r
równie dobrze mogę zrobić wszystko, aby był solidny.Użyłbym
grep
filtrować je. Na przykład :Następnie przenieś outfile z powrotem do infile.
źródło
sed
to zdecydowanie najlepsza droga.Ta niewielka modyfikacja polecenia @ heemayl spowodowała usunięcie linii bez względu na to, czy we wzorcu użyto tego samego przypadku, czy nie, ze względu na I w odwołaniu do wzorca.
Jeśli masz kilka plików w katalogu, w którym chcesz to zrobić, możesz połączyć to z find w ten sposób.
Opcja maxdepth oznacza, że nie będzie się to powtarzać w katalogach.
źródło
Inna opcja Pythona:
Gdzie f jest ścieżką do pliku między cudzysłowami.
źródło
Grep
(?!HERE IT IS)
negatywne stwierdzenie wyprzedzające, które powoduje, że silnik wyrażenia regularnego dopasowuje całą granicę początkową linii ( która zwykle jest dopasowywana^
) tylko wtedy, gdy nie następuje po niej ciągHERE IT IS
pyton
Zapisz skrypt w pliku, powiedz,
script.py
a następnie uruchom go za pomocą poniższego polecenia na terminalu.źródło
[print(l, end = "") for l in open(fil).readlines() if not re.match("HERE IT IS", l)]
, ale nie jest to o wiele bardziej wydajne niżstartswith
. Zastanawiałem się, jak[print(l, end = "") for l in open(f).readlines() if not l.startswith("HERE IT IS")]
nie będzie generować wyników na liście.Możesz używać Vima w trybie Ex:
g
globalne wyszukiwanied
usunąćx
Zapisz i zamknijźródło