Powiedzmy, że mam zmienną
line="This is where we select from a table."
teraz chcę grep, ile razy zaznaczenie występuje w zdaniu.
grep -ci "select" $line
Próbowałem tego, ale to nie zadziałało. Też próbowałem
grep -ci "select" "$line"
To wciąż nie działa. Pojawia się następujący błąd.
grep: This is where we select from a table.: No such file or directory
...<<<"$line"
.grep
Zamiast tego polecenie oczekuje plikuOdpowiedzi:
Czy
grep
przeczytać na jego standardowego wejścia. Proszę bardzo, używając rury ...... lub ciąg tutaj ...
Przed grepowaniem możesz też zastąpić spacje znakiem nowej linii:
... lub możesz poprosić
grep
o wydrukowanie tylko meczu:Pozwoli ci to pozbyć się reszty linii, gdy pojawi się dopasowanie.
Edycja: Ups, czytaj trochę za szybko, dzięki Marco . Aby policzyć zdarzenia, po prostu potokuj dowolne z nich
wc(1)
;)Kolejna edycja wykonana po komentarzu lzkaty , cytująca
$line
przy użyciuecho
.źródło
wc
aby wykonać zadanie:grep -o <string> <<< "$variable" | wc -l
echo "$line"
aby zachować istniejące nowe wiersze zamiast tworzyć je za pomocątr
Nie musisz dzwonić
grep
po tak prostą rzecz.Lub jako funkcja:
Zajmuje 2 lub 3 argumenty. Podanie czegoś więcej wykrzywi jego wyniki. Możesz go używać w następujący sposób:
... który wypisuje liczbę wystąpień
.
w,...
jeśli występuje co najmniej 2 razy. Lubię to:Jeśli
$_occur
jest pusty lubunset
gdy zostanie wywołany, nie wpłynie w ogóle na żadne zmienne powłoki, areturn
1, jeśli"$2"
wystąpi"$1"
krócej niż"$3"
razy. Lub, jeśli zostanie wywołany tylko z dwoma argumentami, wyniesiereturn
1 tylko wtedy, gdy"$2"
nie ma go"$1"
. W przeciwnym razie zwraca 0.I tak w najprostszej formie możesz:
... które drukuje ...
...ale...
... wydrukuje ...
Możesz także napisać to nieco inaczej i pominąć cudzysłowy
$2
zarówno w instrukcji, jak(*"$2"*)
i"${1#*"$2"}"
. Jeśli to zrobisz, możesz użyć globów powłoki do dopasowań, takich jaksh[io]te
test dopasowania.źródło
bash
idash
/sh
(i prawdopodobnie kilka innych).