Mam plik zawierający moje dane osobowe (.txt). Jak mogę za pośrednictwem terminalu skopiować tylko kilka szczegółów z pliku i umieścić je w nowym .txt
pliku?
Na przykład, jeśli jest to zawartość pliku:
name : farah age : 23 phone number : 0123 education : degree
jak mogę skopiować tylko wiek i numer telefonu i wysłać je do nowego .txt
pliku?
command-line
text-processing
MsWanie
źródło
źródło
Odpowiedzi:
Można to zrobić na kilka sposobów. Jeśli twój plik ma jakąś znaną strukturę, możesz użyć
grep
. Dogrep
wyszukiwania poleceń pliku dla określonego wyrażenia i zwroty liniach pasujących do tego wyrażenia. Więc jeśli twój plik wyglądamożesz biec,
grep Name info.txt
a on wróciName: Sally
. Następnie możesz przekierować dane wyjściowe do innego pliku. Więc dzwonięgrep Name info.txt > info2.txt
wypisze linię do nowego pliku info2.txt. Jeśli chcesz dodać nowe linie, możesz to zrobić
grep Address info.txt >> info2.txt
w przeciwnym razie plik zostanie zastąpiony.
Możesz także nauczyć się korzystać z edytora tekstu wiersza poleceń, takiego jak vim.
źródło
Możesz użyć grep, aby wyszukać wyrażenie regularne w pliku details.txt i przekierować wynik do nowego pliku.
Jeśli wszystkie wiersze, które chcesz skopiować, mają coś wspólnego, innych wierszy nie możesz użyć:
Jeśli nie trzeba będzie szukać dla każdego wiersza, który chcesz skopiować, wciąż przy grep, i dołączyć je do new.txt korzystania
>>
w zastępstwie>
.źródło
Istnieją również edytory, które działają w terminalu, np. Nano, vi i emacs.
Jeśli korzystasz z graficznego interfejsu użytkownika na komputerze lokalnym i terminalu na komputerze zdalnym, możesz także użyć myszy do kopiowania i wklejania z jednego okna / karty terminala do drugiego.
źródło
Zakładając, że plik wejściowy
details.txt
zawiera:możesz wybrać linie „nazwa” i „telefon” przez rozszerzone grep i przekierować wyjście do new.txt:
Spowoduje to utworzenie pliku new.txt z:
Jak to działa:
Grep drukuje tylko dopasowane linie. Te
-E
opcje włączone rozszerzonego regexp, który daje możliwość skorzystania|
(alternatywa). Pamiętaj, aby zacytować cały wzór, więc|
zostanie zinterpretowany przez grep. W przeciwnym razie powłoka spróbuje zinterpretować. Nie chcesz tego tutaj.źródło
Pokazany plik ma wszystkie szczegóły w jednym wierszu:
Założyłem, że możesz na stałe wpisać kod
age :
do polecenia itp., Ale następujący po nim tekst będzie się różnił, a szczegóły mogą nie być w podanej kolejności lub być ciągłe.Można wyodrębnić części linii z
grep
„s-o
flagi. Drukuje tylko dopasowaną część, a nie całą linię.Jeśli chcesz dołączyć części
age :
iphone number :
, możesz użyć-e
flagi, aby określić wiele dopasowań lub naprzemiennie.Wyrażenie
[^ ]*
oznacza dowolną liczbę znaków, które nie są spacjami, więc dopasowuje znaki poage :
maksymalnie spacji.Zamień
file
na nazwę pliku zawierającego twoje dane. Możesz zapisać nowy plik, przekierowując dane wyjściowe do nowego pliku za pomocą>
operatora, w następujący sposób:Gdy to zrobisz, nie zobaczysz żadnych wyników. Najpierw sprawdź dane wyjściowe, a następnie dodaj przekierowanie.
Oto przykład z naprzemiennością. Używamy
-E
flagi, aby powiedziećgrep
o rozszerzonym wyrażeniu regularnym. Składnia jest(pattern1|pattern2)
taka - pasujepattern1
i / lubpattern2
. Jeśli którykolwiek zostanie znaleziony, zostanie wydrukowany (niezależnie od tego, czy drugi zostanie znaleziony, czy nie). Teraz używam+
znaczenia co najmniej jednego z poprzedzających znaków, zamiast*
oznaczać zero lub więcej poprzedzających znaków. W tym kontekście oba działają równie dobrze.Jeśli chcesz pominąć części
age :
iphone number:
, możesz użyć-P
flagi, aby poprosićgrep
o użycie wyrażeń regularnych zgodnych z Perl. Obsługuje to naprzemienność, a także sposób dopasowywania tekstu po danym wzorcu:Jeśli chcesz sformatować tekst inaczej, możesz użyć
sed
na przykład:To zależy od tego, czy
age
nadejdzie wcześniejphone number
, więc dostosuj odpowiednio, jeśli tak nie jest. Jeśli nie możesz polegać na zamówieniu, możesz użyć tego bardzo skomplikowanego polecenia:To
phone number :
zmienia kolejność linii, tak aby sekcja była pierwsza na każdej linii, a następnie dokonuje drugiej zamiany, aby wybrać pożądane szczegóły. Technikę zastosowaną tutaj zawdzięczam Muru .Uwagi na temat
sed
poleceń nieobjętych poprzednimi objaśnieniami-r
użyj rozszerzonego wyrażenia regularnego dla bardziej czytelnych poleceń (GNUsed
rozumie-E
to samo znaczenie)s/old/new/
wymienićold
znew
(pattern)
zapisuje się wpattern
celu późniejszego użycia, za pomocą\1
lub\2
etc (zgodnie z kolejnością od lewej do prawej, w której występują grupy przechwytywania - zwróć uwagę, żesed
pomieści tylko 7 z nich!)..
dowolny znak, dlatego.*
reprezentuje dowolną liczbę dowolnych znaków.;
rozdziela polecenia, jak w powłoce.źródło