$ cat test.dat
LINE 1
LINE 2
POP3_SERVER_NAME = localhost
Wyszukaj wiersze zawierające „POP3_SERVER_NAME”; wydrukuj ostatnie pole. Nie zależy to od tego, że POP3_SERVER_NAME zawsze znajduje się na linii 3, co prawdopodobnie jest dobrą rzeczą.
W zależności od aplikacji może być konieczne zaostrzenie wyrażenia regularnego. Na przykład możesz dopasować tylko tę linię, która zaczyna się od POP3_SERVER_NAME.
Korzystanie z sed jest nieco mniej intuicyjne. (Dzięki, zdaję sobie sprawę z ironii.) Zaadresuj wiersz zawierający POP3_SERVER_NAME w dowolnym miejscu. Zastąp pusty ciąg dla całego tekstu od początku wiersza do opcjonalnej spacji po „=”. Następnie wydrukuj.
sed -n -e '/POP3_SERVER_NAME/ s/.*\= *//p' test.dat
awkKomenda jest ładne - ale tylko jeśli masz przestrzenie wokół =. To nie zadziała POP3_SERVER_NAME=localhost.
Marcel Stör
2
@Marcel, Możesz zmienić ogranicznik używany przez awkspacje na coś innego używającego -F. Na przykład: -F "="użyje =jako separatora we wspomnianym przypadku.
mattpr
7
Zastąp ppolecenie zastąpieniem, które usuwa niechcianą część wiersza.
sed -n '3 s/^[^=]*= *//p' installation.sh
Możesz dopasować wiersz według słowa kluczowego, a nie pozycji.
sed -n 's/^ *POP3_SERVER_NAME *= *//p' installation.sh
Wygląda na to, że masz plik konfiguracyjny. To, co możesz zrobić, jest podobne do tego, co sugeruje Adam Siemeon / slm:
sed -nr 's/[^=]+=\s*(.+)$/\1/p' filename
gdzie [^=]nie obejmuje wszystkich znaków „=”, +mówi jeden lub więcej tego samego rodzaju charakteru, to następnie rzeczywiste =, \swszystkie spacje (łącznie z kartami \ti nowych linii \n, \r\ni gładkie przestrzenie „”, natomiast *środki zero lub więcej tego samego rodzaju nawiasy złapać co jest w środku, aby umieścić dobrane sekwencje znaków w \ 1, \ 2, ..., \ n zastępcze zamienne, $oznacza koniec linii Wynika to typowy schemat zastępczy:. s/.../.../modifiers. opcja wiersza poleceń-r oznacza rozszerzona składnia -nwyrażeń regularnych (dla wygody) i oznacza, że nic nie wypisuje, dopóki nie zostanie zażądane w sposób wyraźny. pModyfikator wypisuje wynik.
Możesz dokonać globalnego wyszukiwania za pomocą gmodyfikatora, takiego jak:
sed -nr 's/[^=]+=\s*(.+)$/\1 /pg' filename # note the space after \1
aby uzyskać ciąg rozdzielony ' '(może być \n, \talbo co cię mieć), które można łatwo przetwarzać.
Oba są poprawne, pod warunkiem, że twoje wartości poprzedzone znakiem równania rozciągają się do końca linii i nie są poprzedzone komentarzami lub innymi znakami z semantyką odbiegającą od prostej „wartości”.
Edytować:
Nie mogę tutaj jeszcze komentować postów innych osób. Aby wskazać linię, podaj numer linii, w twoim przypadku 3, przed slub przed znakiem inicjującym cytat (tak jak w vimie).
sed -nr '3s/[^=]+=\s*(.+)$/\1/p' filename
Proszę spojrzeć na info sed. Na przykład szczególnie interesują Cię 3.2 i 4.7.
Piękno Linux / Unix polega na tym, że zwykle istnieje więcej niż jeden sposób, aby coś osiągnąć. W przypadku operacji istnieją co najmniej cztery różne sposoby wyodrębnienia nazwy serwera POP z pliku:
awk
Komenda jest ładne - ale tylko jeśli masz przestrzenie wokół=
. To nie zadziałaPOP3_SERVER_NAME=localhost
.awk
spacje na coś innego używającego-F
. Na przykład:-F "="
użyje=
jako separatora we wspomnianym przypadku.Zastąp
p
polecenie zastąpieniem, które usuwa niechcianą część wiersza.Możesz dopasować wiersz według słowa kluczowego, a nie pozycji.
źródło
Wygląda na to, że masz plik konfiguracyjny. To, co możesz zrobić, jest podobne do tego, co sugeruje Adam Siemeon / slm:
gdzie
[^=]
nie obejmuje wszystkich znaków „=”,+
mówi jeden lub więcej tego samego rodzaju charakteru, to następnie rzeczywiste=
,\s
wszystkie spacje (łącznie z kartami\t
i nowych linii\n
,\r\n
i gładkie przestrzenie „”, natomiast*
środki zero lub więcej tego samego rodzaju nawiasy złapać co jest w środku, aby umieścić dobrane sekwencje znaków w \ 1, \ 2, ..., \ n zastępcze zamienne,$
oznacza koniec linii Wynika to typowy schemat zastępczy:.s/.../.../modifiers
. opcja wiersza poleceń-r
oznacza rozszerzona składnia-n
wyrażeń regularnych (dla wygody) i oznacza, że nic nie wypisuje, dopóki nie zostanie zażądane w sposób wyraźny.p
Modyfikator wypisuje wynik.Możesz dokonać globalnego wyszukiwania za pomocą
g
modyfikatora, takiego jak:aby uzyskać ciąg rozdzielony
' '
(może być\n
,\t
albo co cię mieć), które można łatwo przetwarzać.Oba są poprawne, pod warunkiem, że twoje wartości poprzedzone znakiem równania rozciągają się do końca linii i nie są poprzedzone komentarzami lub innymi znakami z semantyką odbiegającą od prostej „wartości”.
Edytować:
Nie mogę tutaj jeszcze komentować postów innych osób. Aby wskazać linię, podaj numer linii, w twoim przypadku 3, przed
s
lub przed znakiem inicjującym cytat (tak jak w vimie).Proszę spojrzeć na
info sed
. Na przykład szczególnie interesują Cię 3.2 i 4.7.źródło
Lub jeśli masz zawartość w pliku:
źródło
Możesz użyć polecenia cięcia, ustawiając delimetr na „=”, a następnie wydrukować drugie pole w następujący sposób:
źródło
Można to zrobić na wiele sposobów, zważywszy, że plik jest nazywany
foobar
:Określ wzór do wyszukania:
Wyodrębnij za pomocą
sed
Lub używając
sed
icut
źródło
Piękno Linux / Unix polega na tym, że zwykle istnieje więcej niż jeden sposób, aby coś osiągnąć. W przypadku operacji istnieją co najmniej cztery różne sposoby wyodrębnienia nazwy serwera POP z pliku:
grep POP3_SERVER_NAME installation.sh | cut -d'=' -f2
grep POP3_SERVER_NAME installation.sh | awk '{print $3}'
grep POP3_SERVER_NAME installation.sh | sed 's/.*= //'
sed -n 's/^.*POP3_SERVER_NAME = //p' installation.sh
źródło