UNIX'te, uzun bir dizede tek bir kelimeyi nasıl bulabilirsin?

Diyelim ki aşağıdaki dizgeye sahibim:

 mystring="something something something schwifty3 something"

Şimdi ondan sonra bir sayı ile bir schwifty olduğunu biliyorum, ama bu diziden tüm kelimeyi hariç tutulan her şeyi istiyorum.

grep -o does not appear to work or even be a useable option for some reason... any ideas?

2

6 cevap

Boşlukları satır sonlarına çevirerek grep yalnızca tek sözcükleri döndürür.

mystring="something something something schwifty3 something"
echo "$mystring" | tr " " '\n' | grep "schwifty"
4
katma
Bunu sonsuza dek kullanacağım. Teşekkürler, bu mükemmel!
katma yazar driedupsharpie, kaynak

Ne dersin

grep -Po "schwifty\d" <<< $mystring

veya dizgede birden fazla rakam olması durumunda:

grep -Po "schwifty\d+" <<< $mystring
3
katma

Saf bir kabuk yaklaşımı için, ön ek (#) ve sonek (%) kaldırması ile dize ikame çalışması işe yarar:

mystring="something something something schwifty3 something"

s=schwifty

case $mystring in 
(*$s*) 
    a="$s${mystring#*$s}"
    echo ${a%% *}
esac

Bu, $ mystring 'de $ s ile başlayan herhangi bir dizgenin ilk oluşumunu gösterecektir. Varsayım: dizeyi sadece bir ascii uzayda bölün.

Saf kabuk yaklaşımı, sadece kabuk yapılarını ve mekaniklerini kullandığımız anlamına gelir, harici komutlar kullanmaz.

3
katma

grep kelimesi için -w

echo sth sth something sth1|sed 's/ /\n/g'|grep -w sth
sth
sth
1
katma

bash içinde de yapabilirsiniz.

a=" $mystring "      # pad with spaces (in-case the word is first or last)
a="${a#* schwifty}"  # chop all before and including schwifty
a="schwifty${a%% *}" # restore schwifty chop all after first word, 
echo "$a"
0
katma
$ echo $mystring
something something something schwifty3 something

$ echo $mystring | sed -n 's/.*\s*\(schwifty[0-9]\)\s*.*/\1/p'
schwifty3

$ echo $mystring | sed -n 's/.*\s*\(schwifty\)[0-9]\s*.*/\1/p'
schwifty
0
katma