załóżmy, jeśli istnieje plik składający się z następujących wierszy, jeśli są
12345 567 7878 66 er3 t45t y6y46y 4 lata 6 lat 656 lat 5 lat 46y6 65y7 y66uyuy yy46y6y
Dane wyjściowe muszą wyglądać następująco:
66 y6y46y y5y y66uyuyy y46y6y
Próbowałem sed 's/.* //g'
nazwy pliku polecenia i kilku innych sed
poleceń, ale nie działa.
Czy mogę wiedzieć, jakie jest dokładne sed
polecenie?
text-processing
sed
awk
Rajeev Nukala
źródło
źródło
sed
?Odpowiedzi:
Nadal wydrukowałby pustą linię dla każdej pustej linii. Aby tego uniknąć:
źródło
sed -n 's/.*[[:blank:]]\+\([^[:blank:]]\+\)[[:blank:]]*$/\1/p'
..*
na ogonie, prawdopodobnie - wykluczasz wszystko oprócz spacji końcowych w /.*[^[:blank:]]
.awk
Zmienna$NF
jest ostatnie pole każdego rekordu ; możesz go użyć do wydrukowania tylko ostatnich pól pliku w następujący sposób:źródło
Możesz spróbować :
sed 's/.* //'
awk '{print $NF}'
źródło
Jesteś prawie na miejscu. Wystarczy podać ostatnie słowo:
Co to robi:
(Edytowane w celu dodania lepszego rozwiązania. Dzięki Hildred!)
źródło
sed -r 's/.* ([^ ]+)/\1/g'
jeśli dozwolone są rozszerzone wyrażenia regularne, co zwykle ma miejsce.sed 's/.* //'
Możesz użyć odpowiedniego wzorca
grep
zamiastsed
, na przykład:W tym przykładzie
[...]
zawiera zakresy znaków uważane za odpowiednie dla „słowa” (w tym przypadku alfanumeryczne można dodać inne symbole, z których niektóre należy pominąć).źródło
a-Z
ponieważ zakres nie ma większego sensu, nawet w ustawieniach regionalnych opartych na ASCII. Zauważ, że-o
jest to rozszerzenie GNU.Jeśli kwalifikujesz słowo jako dowolną sekwencję 1 lub więcej niepustych znaków, wówczas odpowiedź brzmi zdecydowanie tak, i jest również bardzo prosta. To dlatego, że
[[:blank:]]*
i[^[:blank:]]*
są boolean uzupełnienia oraz - pod warunkiem wszystkie znaki w łańcuchu są kompletne -[[:blank:]]*
U[^[:blank:]]*
można opisać ewentualne ciąg w taki sam sposób.*
robi.Jeśli w ciągu istnieje niekompletny znak lub w inny sposób nieprawidłowa sekwencja bajtów, nie można go z powodzeniem opisać od początku do końca - jak to czasami może się zdarzyć przy interpretacji ciągu w niewłaściwym kodowaniu. Aby zapewnić pełny znak na bajt w dowolnym ciągu, ustawienia narodowe C można wymusić:
... które pozwoliłyby uniknąć problemów z opisywaniem struny od głowy do ogona za pomocą kompleksowego wzorca, takiego jak
.*
lub([ ]*[^ ]*)*
W pełni komplementarny wzór może powtarzać tyle razy, ile jest to konieczne, od lewej do prawej, długości dowolnego łańcucha, aby wylądować na ostatnim możliwym wystąpieniu bez przerwy w schemacie. Jest to definitywnie zwykły język.
BRE:
ERE:
Obie wersje nadal będą drukować puste linie, a to dlatego, że
*
gwiazda Kleene pasuje do zerowego lub więcej wystąpień wzoru. Najpierw dopasowuje zero lub więcej niepustych znaków, następnie zero lub więcej pustych znaków, a następnie zero lub więcej wystąpień zgrupowanych dopasowań, dopóki nie dopasuje ciągu w całości.Po dopasowaniu tego wszystkiego magia dzieje się w zastępstwie - odniesienia zwracane przez grupy
\1
i\2
są ostatnimi wystąpieniami każdego z nich. Tak więc po dokonaniu zamiany cały ciąg jest zastępowany tylko ostatnim wystąpieniem w wierszu zera lub więcej niepustych znaków - lub podgrupy\2
.Oczywiście działa to na każdy możliwy ciąg - nawet pusty - co oznacza, że obie formy wypiszą znaki nowego wiersza dla wierszy zawierających tylko puste znaki lub wcale. Aby sobie z tym poradzić, możesz zrobić kilka rzeczy, ale najpierw sprawmy, aby klasa postaci była nieco łatwiejsza do pisania:
Teraz, aby drukować tylko wtedy, gdy wiersz zawiera jeden lub więcej niepustych znaków, możesz:
BRE:
ERE:
Każda forma będzie działać z dowolną metodą - o ile składnia jest poprawna.
-n
Wyłącza wyłącznik automatyczny druk przestrzeni wzorca, ap
flagi nas///
ubstitution lub/
adres/
poleceń wypisuje jego wyniki tylko w przypadku powodzenia.Tę samą logikę można zastosować, aby uzyskać dowolną
{num}
wystąpienie, takie jak:BRE:
ERE:
... gdzie
num
oba wyrażenia regularne można zastąpić liczbą, aby wydrukować tylko{num}
określone wystąpienie sekwencji niepustych znaków. Stosuje się tutaj nieco inną formę, aby zapewnić, że liczba nie zostanie przekrzywiona dla wiodącej spacji w ciągu.Zauważ, że
-E
przełącznik ERE nased
jest obsługiwany zarówno w wersji BSD, jak i GNU, chociaż nie jest to jeszcze standardowa składnia POSIX.źródło
sed
implementacjami (takimi jak Solaris / usr / bin / sed) i będzie droższy niż bardziej proste podejście (wyczerpuje pamięć z liniami wejściowymi o długości ponad 25 znaków z na przykładsed_su3
z zestawu narzędzi Heirloom). Tak więc, chociaż podoba mi się odpowiedź, nie poleciłbym tego podejścia.s/.* \([^[:blank:]]\{1,\}\).*/\1/
jest znacznie lepsza, ale trudniejsza, gdy w grę wchodzi wiele linii. Jednak pewnego dnia odkryłem, że's/\(\n\)*/\1/g;s/\n\(\n.*\)*/&&/[num];s///[samenum]
mogę całkiem skutecznie to wzmocnić. W każdym razie, dopóki nie ma rażącego błędu w logice, cieszę się - po prostu myślałem, że coś przeoczyłem.sed
s - to trochę dziwne - powinno brzmieć zgodnie ze standardami. xrat mówi ... Standardowi programiści traktowali wspólne zachowanie historyczne, które wspierało"\n*"
, ale nie"\n\{min,max\}", "\(...\)*"
, lub"\(...\)\{min,max\}"
, jako nie zamierzony wynik konkretnej implementacji, i wspierali zarówno duplikację, jak i wyrażenia przedziałowe po podwyrażeniach i referencjach wstecznych.( '*' )
lub wyrażenia przedziałowego (patrz pozycja (5)), to odwołanie wsteczne będzie pasować do ostatniego (skrajnie prawy ) tych ciągów. Jestem pewien, że przetestowałem to w /minised
choć - z pewnością testowałem coś dziwnego z /minised
w innym dniu.Analiza:
s
- zastępstwo/
- początek wyrażenia do poszukiwania^
- od początku linii[[:blank:]]*
- jeśli na początku linii znajdują się puste miejsca.*
- dowolna postać[[:blank:]]
- i pusty znak/
- początek wyrażenia do podstawienia/
- koniec składni poleceniaPS: Napisałem gwiazdę w Commannd.
źródło
s/.*[[:blank:]]//
działałby, chyba że na końcu linii będą puste.Tak. Następujące polecenie sed najpierw usuwa wszystkie końcowe białe znaki (
s/ *$//
), a następnie wszystko, aż do ostatniego białego znaku (s/.* //
). Prawdopodobnie warto zastąpić dosłowne białe znaki[[:blank:]]
, aby uchwycić tabulatory i inne znaki podobne do spacji.źródło
źródło