Bir dize Bash'de bir alt dize i├žerip i├žermedi─čini kontrol etme


Al─▒nan cevaba git


Bash'te bir dizgem var:

 string="My string"
 

Ba┼čka bir dize i├žeriyorsa nas─▒l test edebilirim?

 if [ $string ?? 'foo' ]; then
  echo "It's there!"
fi
 

?? Bilinmeyen operat├Âr├╝m nerede . Eko ve kullan─▒yor muyum grep ?

 if echo "$string" | grep 'foo'; then
  echo "It's there!"
fi
 

Bu biraz sakar g├Âr├╝n├╝yor.


2278









Cevap say─▒s─▒n─▒ say: 22






Sen kullanabilirsiniz Marcus'un cevab─▒ (* joker) ├çift parantez kullan─▒rsan─▒z da bir vaka bildirimi d─▒┼č─▒nda:

 string='My long string'
if [[ $string == *"My long"* ]]; then
  echo "It's there!"
fi
 

─░─čne ipindeki bo┼čluklar─▒n ├žift t─▒rnak aras─▒na yerle┼čtirilmesi * gerekti─čini ve joker karakterlerin d─▒┼čar─▒da olmas─▒ gerekti─čini unutmay─▒n.


3258







E─čer regex yakla┼č─▒m─▒n─▒ tercih ederseniz:

 string='My string';

if [[ $string =~ "My" ]]
then
   echo "It's there!"
fi
 

518







Bir if ifadesi kullanmak konusunda emin de─čilim, ancak case case ile benzer bir etki elde edebilirsiniz:

 case "$string" in 
  *foo*)
    # Do stuff
    ;;
esac
 

316







Bu SO i┼č par├žac─▒─č─▒n─▒n ├žo─čunlukla bash hakk─▒nda s├Âyledi─či gibi, bu yaz─▒n─▒n ├žok alt─▒nda ba─č─▒ms─▒z bir bash i┼člevi b─▒rakt─▒m ...

Her neyse, i┼čte benim

Uyumlu cevap

Bash'e ├Âzg├╝ ├Âzellikleri kullanarak zaten ├žok say─▒da yan─▒t oldu─čundan, me┼čgul kutusu gibi daha fakir ├Âzellikli mermiler alt─▒nda ├žal─▒┼čman─▒n bir yolu var :

 [ -z "${string##*$reqsubstr*}" ]
 

Uygulamada bu ┼čunlar─▒ verebilir:

 string='echo "My string"'
for reqsubstr in 'o "M' 'alt' 'str';do
  if [ -z "${string##*$reqsubstr*}" ] ;then
      echo "String '$string' contain substring: '$reqsubstr'."
    else
      echo "String '$string' don't contain substring: '$reqsubstr'."
    fi
  done
 

Bu, bash , dash , ksh ve ash (busybox) alt─▒nda test edildi ve sonu├ž her zaman:

 String 'echo "My string"' contain substring: 'o "M'.
String 'echo "My string"' don't contain substring: 'alt'.
String 'echo "My string"' contain substring: 'str'.
 

Bir fonksiyona

@EeroAaltonen taraf─▒ndan burada istenildi─či gibi, ayn─▒ merminin bir versiyonu, ayn─▒ mermiler alt─▒nda test edilmi┼čtir:

 myfunc() {
    reqsubstr="$1"
    shift
    string="[email protected]"
    if [ -z "${string##*$reqsubstr*}" ] ;then
        echo "String '$string' contain substring: '$reqsubstr'.";
      else
        echo "String '$string' don't contain substring: '$reqsubstr'." 
    fi
}
 

Sonra:

 $ myfunc 'o "M' 'echo "My String"'
String 'echo "My String"' contain substring 'o "M'.

$ myfunc 'alt' 'echo "My String"'
String 'echo "My String"' don't contain substring 'alt'.
 

Dikkat: ka├ž─▒n─▒lmaz veya ├žift t─▒rnak i├žine almaktan ve / veya ├žift t─▒rnak i├žine almak zorundas─▒n─▒z:

 $ myfunc 'o "M' echo "My String"
String 'echo My String' don't contain substring: 'o "M'.

$ myfunc 'o "M' echo \"My String\"
String 'echo "My String"' contain substring: 'o "M'.
 

Basit fonksiyon

Bu busybox , ├žizgi ve tabii ki bash alt─▒nda test edildi :

 stringContain() { [ -z "${2##*$1*}" ]; }
 

Hepsi bu kadar millet!

├ľyleyse ┼čimdi:

 $ if stringContain 'o "M3' 'echo "My String"';then echo yes;else echo no;fi
no
$ if stringContain 'o "M' 'echo "My String"';then echo yes;else echo no;fi
yes
 

... Veya, g├Ânderilen dizge bo┼č olabilirse, @Sjlver'in i┼čaret etti─či gibi, i┼člev ┼č├Âyle olacakt─▒r:

 stringContain() { [ -z "${2##*$1*}" ] && [ -z "$1" -o -n "$2" ]; }
 

ya ├Ânerdi─či gibi Adrian G├╝nter yorumuyla ka├ž─▒narak, -o SWITCHE:

 stringContain() { [ -z "${2##*$1*}" ] && { [ -z "$1" ] || [ -n "$2" ];};}
 

Son (basit) i┼člev:

Ve potansiyel olarak daha h─▒zl─▒ hale getirmek i├žin testi tersine ├ževirmek:

 stringContain() { [ -z "$1" ] || { [ -z "${2##*$1*}" ] && [ -n "$2" ];};}
 

Bo┼č dizelerle:

 $ if stringContain '' ''; then echo yes; else echo no; fi
yes
$ if stringContain 'o "M' ''; then echo yes; else echo no; fi
no
 

Dava ba─č─▒ms─▒z ( sadece bash !)

B├╝y├╝k / k├╝├ž├╝k harf bak─▒ms─▒z test dizgisi i├žin her dizgiyi k├╝├ž├╝k harfe d├Ân├╝┼čt├╝r├╝n:

 stringContain() {
    local _lc=${2,,}
    [ -z "$1" ] || { [ -z "${_lc##*${1,,}*}" ] && [ -n "$2" ] ;} ;}
 

Kontrol:

 stringContain 'o "M3' 'echo "my string"' && echo yes || echo no
no
stringContain 'o "My' 'echo "my string"' && echo yes || echo no
yes
if stringContain '' ''; then echo yes; else echo no; fi
yes
if stringContain 'o "M' ''; then echo yes; else echo no; fi
no
 

208







Kabuk komut dosyas─▒ kullan─▒m─▒n─▒n daha az dil ve daha fazla komut koleksiyonu oldu─čunu unutmay─▒n. ─░├žg├╝d├╝sel olarak, bu "dilin" if bir [ veya a ile takip etmenizi gerektirdi─čini d├╝┼č├╝n├╝yorsunuz [[ . Her ikisi de, sadece ba┼čar─▒ veya ba┼čar─▒s─▒zl─▒k g├Âsteren bir ├ž─▒k─▒┼č durumu d├Ând├╝ren komutlard─▒r (di─čer t├╝m komutlar gibi). Bana kal─▒rsa do─čru Bu nedenle grep de─čil, [ komuta.

Sadece yap:

 if grep -q foo <<<"$string"; then
    echo "It's there"
fi
 

┼×imdi if onu izleyen komutun ├ž─▒k─▒┼č durumunu test etmeyi d├╝┼č├╝n├╝yorsunuz ( noktal─▒ virg├╝l ile tamamlay─▒n). S─▒namakta oldu─čunuz dizenin kayna─č─▒n─▒ neden yeniden d├╝┼č├╝nm├╝yorsunuz?

 ## Instead of this
filetype="$(file -b "$1")"
if grep -q "tar archive" <<<"$filetype"; then
#...

## Simply do this
if file -b "$1" | grep -q "tar archive"; then
#...
 

Bu -q se├ženek grep'i hi├žbir ┼čey ├ž─▒kt─▒s─▒z hale getirir, ├ž├╝nk├╝ sadece d├Ân├╝┼č kodunu istiyoruz. <<< kabu─čun bir sonraki kelimeyi geni┼čletmesini ve << buradaki belgenin tek sat─▒rl─▒k bir versiyonunu komuta girdi olarak kullanmas─▒n─▒ sa─člar (bunun standart m─▒ yoksa bir bashizm mi oldu─čundan emin de─čilim).


141







Kabul edilen cevap en iyisidir, ancak yapman─▒n birden fazla yolu oldu─ču i├žin i┼čte ba┼čka bir ├ž├Âz├╝m:

 if [ "$string" != "${string/foo/}" ]; then
    echo "It's there!"
fi
 

${var/search/replace} oldu─ču $var ilk ├Ârne─či ile search yerine replace o bulunursa, (o de─či┼čmez $var ). foo Hi├žbir ┼čeyle de─či┼čtirmeyi denemezseniz ve string de─či┼čmi┼čse, o zaman a├ž─▒k├ža foo bulundu.


89







├ľyleyse, soruna pek ├žok yararl─▒ ├ž├Âz├╝m var - ama hangisi en h─▒zl─▒ / en d├╝┼č├╝k kayna─č─▒ kullan─▒yor?

Bu ├žer├ževeyi kullanarak tekrarlanan testler:

 /usr/bin/time bash -c 'a=two;b=onetwothree; x=100000; while [ $x -gt 0 ]; do TEST ; x=$(($x-1)); done'
 

Her seferinde TEST'in de─či┼čtirilmesi:

 [[ $b =~ $a ]]           2.92user 0.06system 0:02.99elapsed 99%CPU

[ "${b/$a//}" = "$b" ]   3.16user 0.07system 0:03.25elapsed 99%CPU

[[ $b == *$a* ]]         1.85user 0.04system 0:01.90elapsed 99%CPU

case $b in *$a):;;esac   1.80user 0.02system 0:01.83elapsed 99%CPU

doContain $a $b          4.27user 0.11system 0:04.41elapsed 99%CPU
 

(doContain, F. Houri'nin cevab─▒ndayd─▒)

Ve k─▒k─▒rdamalar i├žin:

 echo $b|grep -q $a       12.68user 30.86system 3:42.40elapsed 19%CPU !ouch!
 

Bu y├╝zden basit ikame se├žene─či tahmin edilip uzat─▒lm─▒┼č bir testte veya bir durumda olsun kazan─▒r. Dava ta┼č─▒nabilir.

100000 greps'e boru vermek tahminen ac─▒ verici! Harici yard─▒mc─▒ programlar─▒ ihtiya├ž duymadan kullanma konusundaki eski kural ge├žerlidir.


49







Bu ayn─▒ zamanda ├žal─▒┼č─▒r:

 if printf -- '%s' "$haystack" | egrep -q -- "$needle"
then
  printf "Found needle in haystack"
fi
 

Ve negatif test:

 if ! printf -- '%s' "$haystack" | egrep -q -- "$needle"
then
  echo "Did not find needle in haystack"
fi
 

San─▒r─▒m bu tarz biraz daha klasik - Bash kabu─čunun ├Âzelliklerine daha az ba─č─▒ml─▒.

-- Arg├╝man gibi se├ženekler, benzer girdi dizeleri kar┼č─▒ korunan kullan─▒lan saf POSIX paranoya vard─▒r --abc ya -a .

Not: S─▒k─▒ bir d├Âng├╝de, bu kod, dahili Bash kabuk ├Âzelliklerini kullanmaktan ├žok daha yava┼č olacakt─▒r; ├ž├╝nk├╝ bir (veya iki) ayr─▒ i┼člem, borular arac─▒l─▒─č─▒yla olu┼čturulacak ve ba─članacakt─▒r.


26







Bash4 + ├Ârnekleri. Not: S├Âzler bo┼čluk b─▒rak─▒ld─▒─č─▒nda vb. T─▒rnak kullanmak sorunlara neden olur. Her zaman bash IMO'da al─▒nt─▒ yap─▒n.

─░┼čte baz─▒ ├Ârnekler BASH4 +:

├ľrnek 1, dizede 'yes' ifadesini kontrol edin (b├╝y├╝k / k├╝├ž├╝k harf duyarl─▒):

     if [[ "${str,,}" == *"yes"* ]] ;then
 

├ľrnek 2, dizede 'yes' ifadesini kontrol edin (b├╝y├╝k / k├╝├ž├╝k harf duyarl─▒):

     if [[ "$(echo "$str" | tr '[:upper:]' '[:lower:]')" == *"yes"* ]] ;then
 

├ľrnek 3, dizede 'yes' ifadesini kontrol edin (b├╝y├╝k / k├╝├ž├╝k harfe duyarl─▒):

      if [[ "${str}" == *"yes"* ]] ;then
 

├ľrnek 4, dizede 'yes' ifadesini kontrol edin (b├╝y├╝k / k├╝├ž├╝k harfe duyarl─▒):

      if [[ "${str}" =~ "yes" ]] ;then
 

├ľrnek 5, tam e┼čle┼čme (b├╝y├╝k / k├╝├ž├╝k harfe duyarl─▒):

      if [[ "${str}" == "yes" ]] ;then
 

├ľrnek 6, tam e┼čle┼čme (b├╝y├╝k / k├╝├ž├╝k harf duyarl─▒):

      if [[ "${str,,}" == "yes" ]] ;then
 

├ľrnek 7, tam e┼čle┼čme:

      if [ "$a" = "$b" ] ;then
 

├ľrnek 8, joker karakter e┼čle┼čmesi .ext (b├╝y├╝k / k├╝├ž├╝k harfe duyars─▒z):

      if echo "$a" | egrep -iq "\.(mp[3-4]|txt|css|jpg|png)" ; then
 

keyfini ├ž─▒kar─▒n.


18







Buna ne dersin:

 text="   <tag>bmnmn</tag>  "
if [[ "$text" =~ "<tag>" ]]; then
   echo "matched"
else
   echo "not matched"
fi
 

17


2009-02-09





Paul'un performans kar┼č─▒la┼čt─▒rmas─▒nda belirtti─či gibi:

 if echo "abcdefg" | grep -q "bcdef"; then
    echo "String contains is true."
else
    echo "String contains is not true."
fi
 

Bu, POSIX'in Marcus taraf─▒ndan sa─članan "$ string" ifadesinde oldu─ču gibi, ancak case ifadesinin yan─▒t─▒ndan biraz daha kolayd─▒r. Ayr─▒ca, bunun, Paul'un i┼čaret etti─či gibi, bunu bir d├Âng├╝ halinde kullanmad─▒─č─▒n─▒zdan, bir case ifadesini kullanmaktan ├žok daha yava┼č olaca─č─▒n─▒ unutmay─▒n.


12







Bu Y─▒─č─▒n Ta┼čmas─▒ cevab─▒ bo┼čluk ve ├žizgi karakterlerini yakalayan tek ki┼čiydi:

 # For null cmd arguments checking   
to_check=' -t'
space_n_dash_chars=' -'
[[ $to_check == *"$space_n_dash_chars"* ]] && echo found
 

11







Biri:

 [ $(expr $mystring : ".*${search}.*") -ne 0 ] && echo 'yes' ||  echo 'no'
 

9







 [[ $string == *foo* ]] && echo "It's there" || echo "Couldn't find"
 

8







Sed'i severim.

 substr="foo"
nonsub="$(echo "$string" | sed "s/$substr//")"
hassub=0 ; [ "$string" != "$nonsub" ] && hassub=1
 

D├╝zenle, Mant─▒k:

  • Dizeden alt dize ├Ârne─čini kald─▒rmak i├žin sed komutunu kullan─▒n.

  • Yeni dize eski dizgeden farkl─▒ysa, alt dize var


6


2016-03-03





Bu i┼čleve ├žok s─▒k ihtiya├ž duydu─čumu fark ettim, bu y├╝zden benimki .bashrc gibi ev yap─▒m─▒ bir kabuk i┼člevi kullan─▒yorum;

 function stringinstring()
{
    case "$2" in 
       *"$1"*)
          return 0
       ;;
    esac   
    return 1
}
 

$string1 ( Abc ) 'nin $string2 ( 123abcABC diyelim ) i├žerdi─čini test stringinstring "$string1" "$string2" etmek i├žin, sadece geri d├Ân├╝┼č de─čerini kontrol edip kontrol etmem gerekiyor.

 stringinstring "$str1" "$str2"  &&  echo YES  ||  echo NO
 

5







grep -q bu ama├ž i├žin kullan─▒┼čl─▒d─▒r.

Ayn─▒ kullanarak awk :

 string="unix-bash 2389"
character="@"
printf '%s' "$string" | awk -vc="$character" '{ if (gsub(c, "")) { print "Found" } else { print "Not Found" } }'
 

Çıktı:

Bulunamad─▒

 string="unix-bash 2389"
character="-"
printf '%s' "$string" | awk -vc="$character" '{ if (gsub(c, "")) { print "Found" } else { print "Not Found" } }'
 

Çıktı:

Bulunan

Orijinal kaynak: http://unstableme.blogspot.com/2008/06/bash-search-letter-in-string-awk.html


5


2008-12-21





.Bash_profile ve PATH 2 bin dirsimi i├žeriyorsa grep'i nas─▒l kulland─▒m?

 # .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi

U=~/.local.bin:~/bin

if ! echo "$PATH" | grep -q "home"; then
    export PATH=$PATH:${U}   
fi
 

5







Oobash'─▒ deneyin, bash 4 i├žin OO tarz─▒ bir dize k├╝t├╝phanesidir. Alman umlaut'lar─▒n─▒ destekliyor. Bash ile yaz─▒lm─▒┼čt─▒r. Bir├žok fonksiyonlar─▒ mevcuttur: -base64Decode , -base64Encode , -capitalize , -center , -charAt , -concat , -contains , -count , -endsWith , -equals , -equalsIgnoreCase , -reverse , -hashCode , -indexOf , -isAlnum , -isAlpha , -isAscii , -isDigit , -isEmpty , -isHexDigit , -isLowerCase , -isSpace , -isPrintable , -isUpperCase , -isVisible , -lastIndexOf , -length , -matches , -replaceAll , -replaceFirst , -startsWith , -substring , -swapCase , -toLowerCase , -toString , -toUpperCase , -trim , ve -zfill .

─░├žerir ├Ârne─čine bak─▒n:

 [Desktop]$ String a testXccc                                                  
[Desktop]$ a.contains tX                   
true                                                           
[Desktop]$ a.contains XtX      
false      
 

Oobash Sourceforge.net adresinde mevcuttur .


3







Tam kelime e┼čle┼čmesi:

 string='My long string'
exactSearch='long'

if grep -E -q "\b${exactSearch}\b" <<<${string} >/dev/null 2>&1
  then
    echo "It's there"
  fi
 

3







Sorunun uzat─▒lmas─▒ burada yan─▒tland─▒ https://stackoverflow.com/a/8811800/712666

Bu ├ž├Âz├╝m ├Âzel karakterlerle ├žal─▒┼č─▒r:

 # contains(string, substring)
#
# Returns 0 if the specified string contains the specified substring,
# otherwise returns 1.
contains() {
    string="$1"
    substring="$2"

    if echo "$string" | $(type -p ggrep grep | head -1) -F -- "$substring" >/dev/null; then
        return 0    # $substring is in $string
    else
        return 1    # $substring is not in $string
    fi
}

contains "abcd" "e" || echo "abcd does not contain e"
contains "abcd" "ab" && echo "abcd contains ab"
contains "abcd" "bc" && echo "abcd contains bc"
contains "abcd" "cd" && echo "abcd contains cd"
contains "abcd" "abcd" && echo "abcd contains abcd"
contains "" "" && echo "empty string contains empty string"
contains "a" "" && echo "a contains empty string"
contains "" "a" || echo "empty string does not contain a"
contains "abcd efgh" "cd ef" && echo "abcd efgh contains cd ef"
contains "abcd efgh" " " && echo "abcd efgh contains a space"

contains "abcd [efg] hij" "[efg]" && echo "abcd [efg] hij contains [efg]"
contains "abcd [efg] hij" "[effg]" || echo "abcd [efg] hij does not contain [effg]"

contains "abcd *efg* hij" "*efg*" && echo "abcd *efg* hij contains *efg*"
contains "abcd *efg* hij" "d *efg* h" && echo "abcd *efg* hij contains d *efg* h"
contains "abcd *efg* hij" "*effg*" || echo "abcd *efg* hij does not contain *effg*"
 

3







Bu i┼člevi kullan─▒yorum (bir ba─č─▒ml─▒l─▒k dahil edilmemi┼č ancak a├ž─▒k). A┼ča─č─▒da g├Âsterilen testleri ge├žer. ─░┼člev> 0 de─čerini d├Ând├╝r├╝rse, dize bulundu. Bunun yerine kolayca 1 veya 0 d├Ând├╝rebilirsiniz.

 function str_instr {
   # Return position of ```str``` within ```string```.
   # >>> str_instr "str" "string"
   # str: String to search for.
   # string: String to search.
   typeset str string x
   # Behavior here is not the same in bash vs ksh unless we escape special characters.
   str="$(str_escape_special_characters "${1}")"
   string="${2}"
   x="${string%%$str*}"
   if [[ "${x}" != "${string}" ]]; then
      echo "${#x} + 1" | bc -l
   else
      echo 0
   fi
}

function test_str_instr {
   str_instr "(" "'[email protected] (dev,web)'" | assert_eq 11
   str_instr ")" "'[email protected] (dev,web)'" | assert_eq 19
   str_instr "[" "'[email protected] [dev,web]'" | assert_eq 11
   str_instr "]" "'[email protected] [dev,web]'" | assert_eq 19
   str_instr "a" "abc" | assert_eq 1
   str_instr "z" "abc" | assert_eq 0
   str_instr "Eggs" "Green Eggs And Ham" | assert_eq 7
   str_instr "a" "" | assert_eq 0
   str_instr "" "" | assert_eq 0
   str_instr " " "Green Eggs" | assert_eq 6
   str_instr " " " Green "  | assert_eq 1
}
 

2



─░lgili yay─▒nlar


Bir SQL Server tablosunda bir s├╝tun olup olmad─▒─č─▒n─▒ kontrol etme?

Dize alt dize i├žerip i├žermedi─čini nas─▒l kontrol edebilirim? [├žift]

Bir eleman─▒n bir dizide olup olmad─▒─č─▒n─▒ kontrol etme

Go'da bir dosyan─▒n olup olmad─▒─č─▒n─▒ nas─▒l kontrol edebilirim?

Dize dizesinde bir dize i├žerip i├žermedi─čini kontrol etmek i├žin C# kullan─▒m─▒

Bir bash beti─činde root olarak ├žal─▒┼č─▒p ├žal─▒┼čmad─▒─č─▒n─▒ kontrol etme

Dize yaln─▒zca rakam i├žerip i├žermedi─čini kontrol etmenin en h─▒zl─▒ yolu

String giri┼činin say─▒ olup olmad─▒─č─▒ nas─▒l kontrol edilir? [├žift]

Swift'deki Belgeler dizininde bir dosya olup olmad─▒─č─▒n─▒ kontrol etme?

Enum listesinde dize de─čeri olup olmad─▒─č─▒n─▒ kontrol nas─▒l?

Etiketle ilgili di─čer sorular [string]


Bu ne zaman kendini kendine kullanmal─▒?

ÔÇŽ De─čerlerine gir (SELECTÔÇŽ FROMÔÇŽ)

Uzak makinede bir kabuk beti─čini ├žal─▒┼čt─▒rmak i├žin SSH nas─▒l kullan─▒l─▒r?

Git merge --squash nas─▒l kullan─▒l─▒r?

Bir Docker konteynerinin kabu─čuna nas─▒l girebilirim?

REST API / web servisini g├╝vence alt─▒na almak i├žin En ─░yi Uygulamalar [kapal─▒]

Gerekli k├╝t├╝phane k─▒s─▒tlamas─▒ nedeniyle s─▒n─▒fta eri┼čim k─▒s─▒tlamas─▒ rt.jar?

Bir dize C# enum i├žin d├Ân├╝┼čt├╝rme

HTML Çapasını 'name' veya 'id' ile yapmalı mıyım?

jQuery Ajax Dosya Y├╝kle