W następującym pliku:
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut eu metus id lectus vestibulum ultrices. Maecenas rhoncus.
Chcę usunąć wszystko przed, consectetuer
a potem wszystko elit
.
Moje pożądane wyjście:
consectetuer adipiscing elit.
W jaki sposób mogę to zrobić?
shell-script
text-processing
manuel
źródło
źródło
sed
. Może to byćperl
, a nawet czysty bash.Odpowiedzi:
Użyłbym sed
Zdekodowano sed s / find / replace / syntax:
s/^.*
- zamień zaczynając od początku linii (^
), a następnie cokolwiek (.*
) do ...\(
- uruchom nazwany blokconsectetuer.*elit\.
- dopasuj pierwsze słowo, wszystko (.*
) do ostatniego słowa (w tym przypadku łącznie z kropką końcową (zmienioną)), którą chcesz dopasować\)
- zakończyć nazwany blok.*
) do końca linii ($
)/
- zakończ zastępczą sekcję znajdowania\1
- zamień na blok nazwy między powyższym\(
a\)
powyższym/
- zakończyć wymianęźródło
^
ani,$
ponieważ sed spróbuje znaleźć najdłuższe dopasowanie. Być może przegapiłeś kropkę poelit
, możesz wstawić w\.
razie potrzeby.^
i$
nie są konieczne - zostawiłem je tam, ponieważ pytający zauważył (pierwotnie), że był trochę początkujący i może to być pomocne w innych kontekstach.Jeśli każda linia zawiera zarówno wzorzec początkowy, jak i końcowy, najłatwiej to zrobić za pomocą
grep
. Zamiast usuwać początek i koniec każdego wiersza, możesz po prostu wyprowadzić zawartość między oboma wzorami.-o
Opcja w GNUgrep
wyprowadza tylko mecze:Uwaga: jak wspomniano, działa to tylko wtedy, gdy można w ten sposób przeanalizować każdą linię w pliku. Z drugiej strony, to 80% wszystkich typowych przypadków użycia.
źródło
Dwie pętle w AWK:
Gsub AWK:
źródło
Perlowy sposób. Jest to zasadniczo to samo, co odpowiedź MikeV
sed
:Te
-p
środki „wydrukować każdą linijkę po zastosowaniu danego skryptu z-e
”.s/foo/bar/
To operatorowi na zmianę; zastąpi onafoo
zbar
. Nawiasy przechwytują wzorzec i używamy go w zastępstwie. Pierwszy przechwycony wzór to$1
drugi$2
i tak dalej.Tak więc polecenie dopasuje wszystko do
consectetuer
(.*consectetuer
), następnie wszystko doelit
(.*elit
), a następnie wszystko do końca linii (.*
) i zastąpi to przechwyconym wzorcem.źródło
Nie jestem pewien, dlaczego ten tytuł pytania został edytowany „ z pliku ” do „ z linii ”, podczas gdy OP nie wyklucza możliwości na wielu liniach, chociaż przykład wydaje się być tylko jedną linią. Niezależnie od tego pomocne może być tutaj rozwiązanie obejmujące wiele linii.
Działa to w przypadku skrzyżowań:
Przykłady:
odniesienie: Rozszerzenie parametru powłoki
źródło