Bir magistralın bash-də bir substrinqi olub-olmadığını yoxlamaq üçün necə

Başda bir xətt var:

 string="My string" 

Başqa bir xətt olub-olmadığını necə yoxlamaq olar?

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

Harada ?? - mənim naməlum operatorum. Echo və grep istifadə edin?

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

Bir az sakit görünür.

1952
23 окт. 23 aylıq davidsheldon qurdular . 2008-10-23 15:37 '08 at 3:37 pm 2008-10-23 15:37
@ 22 cavab

İki köşeli parantez istifadə etdiyiniz halda, Marcus cavabını (* joker kartlardan) işin ifadəsindən kənar istifadə edə bilərsiniz:

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

İğne halatdakı boşluqların ikiqat qiymətlər arasında yerləşdirilməsini və joker kartların * kənarda olması vacib olduğunu unutmayın.

2795
23 окт. Adam Bellaire tərəfindən 23 oktyabrda cavab verildi 2008-10-23 15:55 '08 at 15:55 2008-10-23 15:55

Normal bir ifadə yanaşmasını tercih etsəniz:

border=0
 string='My string'; if [[ $string =~ .*My.* ]] then echo "It there!" fi 
420
23 окт. Matt Tardiff tərəfindən verilmiş cavab 23 oktyabr. 2008-10-23 23:10 '08 at 11:10 pm 2008-10-23 23:10

İf deyilənin istifadə olunmadığına əmin deyiləm, amma iddia arqumenti ilə oxşar təsiri əldə edə bilərsiniz:

 case "$string" in *foo*) # Do stuff ;; esac 
262
23 окт. Marcus Griep tərəfindən 23 oktun cavabı . 2008-10-23 15:47 '08 at 3:47 pm 2008-10-23 15:47

Uyğun cavab

Bəşərə xüsusi funksiyaları istifadə edərək artıq çox cavablar olduğundan, daha çox ağ xüsusiyyətlərlə, məsələn, ilə işləmək üçün bir yol var:

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

Praktikada bu, verə bilər:

 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, , , kül (busybox) ilə sınaqdan keçirilmişdir və nəticə həmişə:

 myfunc() { reqsubstr="$1" shift string="$@" 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' don't contain substring: 'o "M'. $ myfunc 'o "M' echo \"My String\" String 'echo "My String"' contain substring: 'o "M'. 

Sadə funksiya

Bu, , və əlbəttə test edilmişdir:

 $ 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 

... Və ya, əgər filtrlənmiş simli boş ola bilər, @Sjlver-da göstərildiyi kimi, funksiya belə görünür:

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

ya da, Adrian Güntherin şərhindən irəli gələn kimi, -o switche:

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

Boş xətləri ilə:

 $ if stringContain '' ''; then echo yes; else echo no; fi yes $ if stringContain 'o "M' ''; then echo yes; else echo no; fi no 
167
09 дек. Cavab F. Hauri 09 dekabrda verilir. 2013-12-09 02:06 '13 at 2:06 2013-12-09 02:06

Kabuk skriptinin dildən və bir sıra əmrlərdən daha kiçik olduğunu yadda saxlamaq lazımdır. Səmimi olaraq, bu "dili" [ və ya [[ . Bu əmrlərin hər ikisi sadəcə müvəffəqiyyət və ya uğursuzluq (hər hansı digər komanda kimi) göstərən exit statusunu döndərən əmrlərdir. Buna görə də mən grep istifadə etdim, [ .

Yalnız təqib edin:

 ## 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 #... 

-q seçimi grep çıxışı heç bir şey etməz, çünki biz yalnız qaytarma koduna ehtiyac duyuruq. <<< qabığını növbəti sözü genişləndirmək və onu komanda üçün giriş kimi istifadə etməklə, sənədin bir satırlı versiyasını << (bu standart və ya bashizm olub olmadığından əmin deyiləm) istifadə edir.

127
27 окт. Mark Beyker tərəfindən cavabı Oct 27 2008-10-27 17:57 '08 at 17:57 2008-10-27 17:57

Qəbul edilən cavab daha yaxşıdır, amma bunu etmək üçün birdən çox yol olduğundan başqa bir həll var:

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

${var/search/replace} , search ilk nüsxəsi replace olunarsa ( $var dəyişmirsə) $var . foo heç bir foo əvəz foo və simli dəyişibsə, o zaman açıq-aşkar foo tapıldı.

78
23 окт. Cavab 23 oktyabr tarixində epeymient tərəfindən verilir 2008-10-23 17:35 '08, 5:35 pm 2008-10-23 17:35

Beləliklə, sual üçün çox faydalı həllər var - lakin daha sürətli nədir / ən kiçik qaydanı istifadə edir?

Bu çərçivəni istifadə edərək təkrarlanan testlər:

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

TEST hər dəfə dəyişdirilməsi:

 [[ $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. Khoury'ye cavab olaraq idi)

Və bir kıkırdama üçün:

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

Beləliklə, sadə əvəz etmə variantları proqnozlaşdırılan geniş test və ya vəziyyətdə qalib gəlir. Dava portativdir.

100.000 dərəcə qədər olan boru kəməri gözlənilən ağrılıdır! Xarici kommunallardan istifadə haqqında köhnə qayda tələb olunmur.

38
27 авг. Paul Hedderly tərəfindən verilmiş cavab 27 Avqust. 2014-08-27 22:42 '14 at 10:42 pm 2014-08-27 22:42

Həm də işləyir:

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

Və mənfi test:

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

Bəlkə də, bu üslub bir qədər daha klassikdir, bash qabığının xüsusiyyətlərinə daha az asılıdır.

Arqument parametrlər kimi giriş xəttlərinə qarşı qorunmaq üçün istifadə edilən təmiz POSIX paranoyadır, məsələn, --abc və ya -a .

Qeyd Bağlı bir loopda, bu kod, bir və ya iki ayrı proses yaradılacaq və kanallar vasitəsilə birləşdirildiyi üçün Bash kabuğunun daxili funksiyalarından daha yavaş olacaq.

24
01 дек. Cavab verilir kevinarpe 01 dec. 2012-12-01 18:41 '12 at 18:41 2012-12-01 18:41

Necə olar?

 text=" <tag>bmnmn</tag> " if [[ "$text" =~ "<tag>" ]]; then echo "matched" else echo "not matched" fi 
13
09 февр. Cavab Stefan 09 fevralda verilir. 2009-02-09 09:15 '09 saat 09:15 'da 2009-02-09 09:15

Performans müqayisə edərkən Paul dediyi kimi:

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

Marcus tərəfindən verilmiş "in" $ string "in" halda olduğu kimi POSIX-uyğun, lakin işin tələbinə cavabdan daha az oxumaq asandır. Həm də qeyd edək ki, bu, Paulun işarə etdiyi kimi, iddiadan istifadə etməkdən daha yavaş olacaq, onu bir döngədə istifadə etməyin.

10
01 янв. cavab Samuel Jan 01 tərəfindən verilir 2015-01-01 01:32 '15 at 1:32 'de 2015-01-01 01:32

Yığındakı bu daşqın cavabı boşluqlar və tirləri tuta bilən yeganə idi:

 # For null cmd arguments checking to_check=' -t' space_n_dash_chars=' -' [[ $to_check == *"$space_n_dash_chars"* ]]  echo found 
9
26 авг. cavab Yordan Georgiev 26 avqust verilir. 2013-08-26 13:13 '13 'da 13:13 2013-08-26 13:13

Onlardan biri:

 [ $(expr $mystring : ".*${search}.*") -ne 0 ]  echo 'yes' || echo 'no' 
8
11 нояб. Cavab chemila 11 noyabrda verilir. 2011-11-11 08:51 '11 at 8:51 2011-11-11 08:51

Bash4 +. Qeyd: sözlər istifadə etməyin boşluqlar və s. Həmişə IMO-da bash göstərin.

Bəşq 4-nin bəzi nümunələri:

Örnek 1, xəttdə "bəli" yoxlayın (halda laqeyd):

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

Nümunə 2, xəttdə "bəli" yoxlayın (halda həssas):

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

Nümunə 3, xəttdə "bəli" olub (həssas halda):

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

Nümunə 4, xəttdə "bəli" yoxlayın (halda həssas):

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

Örnek 5, tam uyğunluq (böyük həssas):

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

Misal 6, tam uyğunluq (halda həssas):

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

Misal 7: tam eşleme:

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

Misal 8, joker kodla eşleşir .ext (halda həssas):

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

zövq

7
05 окт. Mike Q 05 oktyabr cevap verdi 2018-10-05 21:54 '18 at 21:54 2018-10-05 21:54
 [[ $string == *foo* ]]  echo "It there" || echo "Couldn't find" 
7
28 апр. Cavab 28 aprel Cihid tərəfindən verilir 2015-04-28 22:55 '15 at 10:55 pm 2015-04-28 22:55

grep -q bu məqsəd üçün faydalıdır.

awk ilə eyni:

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

Nəticə:

Tapılmadı

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

Nəticə:

Tapıldı

Mənbə mənbəyi: http://unstableme.blogspot.com/2008/06/bash-search-letter-in-string-awk.html

4
21 дек. Jadu Saikia tərəfindən verilmiş cavab 21 dekabr 2008-12-21 17:27 '08 saat 17:27 'da 2008-12-21 17:27

Mən sed ilə sevirəm.

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

Change, məntiq:

  • Bir simli bir dize bir nümunə aradan qaldırılması üçün sed istifadə edin.

  • Yeni simli köhnə sətirdən fərqli olsa, bir substrinq var

4
03 марта '16 в 22:12 2016-03-03 22:12 cavab 03.03 ' də saat 10:12' də verilir. 2016-03-03 22:12

Mənim .bash_profile və PATH mənim 2 min dirs mənim daxil əgər grep istifadə necə, onları əlavə etmirə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 
4
14 янв. Cavab 14 yaşdan sonra Leslie Satenstein tərəfindən verilir . 2017-01-14 08:36 '17 'də saat 08:36' də 2017-01-14 08:36

Mən tez-tez bu funksiyanı yerinə yetirmək məcburiyyətində qaldım, buna görə də, mən, ev bürosu funksiyasından istifadə edirəm, buna görə də lazımlı qədər tez-tez xatırlayıram ki,

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

$string1 (say, abc) $string2 (say, 123abcABC) içərsində olub olmadığını yoxlamaq üçün yalnız stringinstring "$string1" "$string2" və qaytarma dəyərini yoxlamaq lazımdır, məsələn

 stringinstring "$str1" "$str2"  echo YES || echo NO 
3
01 июля '12 в 14:31 2012-07-01 14:31 Cavab Kurt Pfeifle tərəfindən 01.07.2012 tarixində saat 14.37- də verilir. 2012-07-01 14:31

Sözlərin tam uyğunluğu:

 string='My long string' exactSearch='long' if grep -E -q "\b${exactSearch}\b" <<<${string} >/dev/null 2> then echo "It there" fi 
2
10 нояб. Eduardo Cuomo tərəfindən verilmiş cavab 10 noyabr. 2016-11-10 17:56 '16 saat 17:56 'də 2016-11-10 17:56

Oobash edin - bu bash 4 üçün bir simli OO kitabxanasıdır. Almaniyanı ümumiləşdirir. Bash ilə yazılmışdır. Bir çox xüsusiyyət mövcuddur: -base64Decode , -base64Encode , -capitalize , -center , -charAt , -concat , -count , -endsWith , -equals , -equalsIgnoreCase , -reverse , -hashCode , -indexOf , -isAlnum , -isAlnum , -isAlpha , -isAscii , -isDigit , -isEmpty , -isHexDigit , -isLowerCase -swapCase , -toLowerCase , -toString , -toUpperCase , -trim-zfill .

Əlavə nümunəsinə baxın:

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

Oobash Sourceforge.net saytında mövcuddur .

2
27 авг. andreas'a 27 Avqust cavab verildi . 2010-08-27 22:19 '10 at 10:19 PM 2010-08-27 22:19

Bu funksiyanı istifadə edirəm (bir asılılıq daxil deyil, amma aydındır). Aşağıdakı testləri keçir. Əgər funksiya bir dəyər> 0 qaytarırsa, simli tapıldı. Siz də asanlıqla 1 və ya 0 qayıda bilərsiniz.

 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 "(" "'foo@host (dev,web)'" | assert_eq 11 str_instr ")" "'foo@host (dev,web)'" | assert_eq 19 str_instr "[" "'foo@host [dev,web]'" | assert_eq 11 str_instr "]" "'foo@host [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 } 
1
11 апр. Ethan Post tərəfindən verilmiş cavab Apr 11 2018-04-11 05:09 '18 saat 17:09 'da 2018-04-11 05:09

Sualın genişləndirilməsi burada cavablandırılmışdır on123.ru.site/questions/2769 / ...

Bu həll xüsusi simvollarla işləyir:

 # 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*" 
0
02 февр. Alex.Designworks tərəfindən verilmiş cavab 02 fevral. 2019-02-02 09:03 '19 'da 9:03' də 2019-02-02 09:03