değişkende grep


58

Diyelim ki değişkenim var

line="This is where we select from a table."

şimdi cümle içinde kaç kez seçim yapıldığını bilmek istiyorum.

grep -ci "select" $line

Bunu denedim, ama işe yaramadı. Ben de denedim

grep -ci "select" "$line"

Hala çalışmıyor. Aşağıdaki hatayı alıyorum.

grep: This is where we select from a table.: No such file or directory

1
Herringring kullanmanız gerekir ...<<<"$line" . Komut grepbunun yerine bir dosya bekliyor
Valentin Bajrami

Yanıtlar:


84

grepstandart girişindeki okundu. İşte, bir boru kullanarak ...

$ echo "$line" | grep select

... ya da burada bir dize ...

$ grep select <<< "$line"

Ayrıca, grepping işleminden önce boşlukları yenileriyle değiştirmek isteyebilirsiniz:

$ echo "$line" | tr ' ' '\n' | grep select

... ya da grepsadece maçı yazdırmak isteyebilirsiniz :

$ echo "$line" | grep -o select

Bu, bir eşleşme olduğunda hattın geri kalanından kurtulmanızı sağlar.

Düzenleme: Hata, biraz hızlı okuyun, teşekkürler Marco . Olayları saymak için, bunlardan herhangi birini wc(1);

Lzkata 'nın yorumundan sonra yapılan başka bir düzenleme , $linekullanırken alıntı yapmak echo.


3
OP bir dize oluşum sayısını saymak istediğinden wc, görevi tamamlamak için ekleyebileceğiniz bir şey:grep -o <string> <<< "$variable" | wc -l
Marco

2
echo "$line"Olanları oluşturmak yerine var olan yeni satırları korumak için kullanıntr
Izkata

Here String'in kullanılabilirliği nedir? Bash veya başka bir kabuk gerektiriyor mu?

Wikipedia'ya göre , burada stringler bash, ksh ve zsh cinsinden elde edilebilir (ama başkaları olabileceğini varsayıyorum).
John WH Smith,

7
test=$line i=0
while case "$test" in (*select*)
test=${test#*select};;(*) ! :;;
esac; do i=$(($i+1)); done

grepBöyle basit bir şey için aramanıza gerek yok .

Veya bir işlev olarak:

occur() while case "$1" in (*"$2"*) set -- \
        "${1#*"$2"}" "$2" "${3:-0}" "$((${4:-0}+1))";;
        (*) return "$((${4:-0}<${3:-1}))";;esac
        do : "${_occur:+$((_occur=$4))}";done

2 veya 3 argüman alıyor. Bundan daha fazlasını sağlamak sonuçlarını çarpıtacaktır. Gibi kullanabilirsiniz:

_occur=0; occur ... . 2 && echo "count: $_occur"

... meydana gelmesi sayımını yazdırır hangi .in ...en az 2 kez meydana gelirse. Bunun gibi, böyle:

count: 3

Eğer $_occurikisinden biri boşsa veya unseto çağrıldığında o zaman hiç hiçbir kabuk değişkenleri etkiler ve olacaktır returneğer 1 "$2"oluşur "$1"daha az "$3"zaman. Veya, yalnızca iki argüman ile çağrılırsa, sadece içinde returndeğilse 1 olacaktır . Aksi takdirde 0 döndürür."$2""$1"

Ve böylece, en basit haliyle, şunları yapabilirsiniz:

occur '' . && echo yay || echo shite

... hangi baskılar ...

shite

...fakat...

occur . . && echo yay || echo shite

... yazdıracak ...

yay

Ayrıca farklı bunu biraz yazmak ve çevresindeki tırnak ihmal olabilir $2hem de (*"$2"*)ve "${1#*"$2"}"beyanı. Bunu yaparsanız sh[io]te, eşleşme testi gibi eşleşmeler için kabuk küre kullanabilirsiniz .


1
+1: Daha hızlı, gerçekten. Çalışıyor bashve dash/ sh(ve muhtemelen birkaç diğerleri).
John WH Smith

@JohnWHSmith - düzenleme daha iyi, ancak yine de taşınabilir.
mikeserv
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.