Kaip patikrinti, ar eilutėje yra antraštė „bash“

Turiu eilutę bazėje:

 string="My string" 

Kaip patikrinti, ar jame yra kita eilutė?

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

Kur ?? - mano nežinomas operatorius. Naudokite aidą ir grep ?

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

Tai atrodo šiek tiek nepatogu.

1952 m
23 окт. rinkinys davidsheldon 23 okt. 2008-10-23 15:37 '08 at 3:37 pm 2008-10-23 15:37
@ 22 atsakymai

Jei naudojate dvigubą skliaustą, galite naudoti „ Marcus“ atsakymą (* pakaitos ženklus) už bylos ataskaitos ribų:

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

Atkreipkite dėmesį, kad adatos virvėje tarpai turi būti tarp kabučių ir lauko ženklai * turi būti išorėje.

2795
23 окт. Adam Bellaire atsakymas spalio 23 d 2008-10-23 15:55 '08 at 15:55 2008-10-23 15:55

Jei pageidaujate įprastos raiškos metodo:

border=0
 string='My string'; if [[ $string =~ .*My.* ]] then echo "It there!" fi 
420
23 окт. atsakymą pateikė Matt Tardiff 23 spalis. 2008-10-23 23:10 '08 at 11:10 pm 2008-10-23 23:10

Nesu tikras, ar naudojamas teiginys „if if“, bet jūs galite gauti panašų poveikį su argumentu dėl bylos:

 case "$string" in *foo*) # Do stuff ;; esac 
262
23 окт. Marcus Griep atsakymas 23 okt. 2008-10-23 15:47 '08 at 3:47 pm 2008-10-23 15:47

Suderinamas atsakymas

Kadangi jau buvo daug atsakymų naudojant specifines „Bash“ funkcijas, yra būdas dirbti su daugiau baltų funkcijų, pavyzdžiui, „ :

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

Praktiškai tai gali suteikti:

 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 

Jis buvo išbandytas , , ir pelenai (busybox) ir rezultatas visada yra:

 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 } 

Tada:

 $ 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'. 

Paprasta funkcija

Tai buvo išbandyta „ , ir, žinoma, „ :

 $ 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 

... Arba, jei failo eilutė gali būti tuščia, kaip nurodyta @Sjlver, funkcija atrodys taip:

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

arba, kaip siūlo Adrian Günther komentaras , vengiant:

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

Tuščios eilutės:

 $ if stringContain '' ''; then echo yes; else echo no; fi yes $ if stringContain 'o "M' ''; then echo yes; else echo no; fi no 
167
09 дек. Atsakymas pateikiamas F. Hauri 09 d. 2013-12-09 02:06 '13, 02:06 2013-12-09 02:06

Turite prisiminti, kad apvalkalo scenarijus yra mažesnis už kalbą ir daugiau komandų. Intuityviai manote, kad ši „kalba“ reikalauja, kad jūs sektumėte, if [ arba [[ . Abi šios komandos yra tiesiog komandos, kurios grąžina išėjimo būseną, rodančią sėkmę arba nesėkmę (kaip ir bet kurią kitą komandą). Dėl šios priežasties norėčiau naudoti grep , o ne [ .

Tiesiog sekite:

 ## 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 parinktis daro grep produkciją nieko, nes mums reikia tik grąžinimo kodo. <<< verčia lukštą išplėsti kitą žodį ir naudoti jį kaip įėjimo į komandą, vienos eilutės versijos dokumentą << (aš nesu įsitikinęs, ar tai yra standartas, ar basizmo).

127
27 окт. Mark Baker atsakymas spalio 27 d 2008-10-27 17:57 '08, 17:57 2008-10-27 17:57

Priimtas atsakymas yra geresnis, tačiau kadangi tai yra daugiau nei vienas būdas, čia yra kitas sprendimas:

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

${var/search/replace} yra $var jei pirmasis search atvejis pakeičiamas pakeičiant, jei jis rastas (jis nepakeičia $var ). Jei bandote pakeisti foo nieko, o eilutė pasikeitė, tada akivaizdu, kad foo buvo rastas.

78
23 окт. atsakymą duoda efemientas spalio 23 d 2008-10-23 17:35 '08 at 17:35 pm 2008-10-23 17:35

Taigi yra daug naudingų sprendimų šiam klausimui - bet kas greičiau / naudoja mažiausius išteklius?

Pakartotiniai bandymai naudojant šį rėmelį:

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

TESTO keitimas kiekvieną kartą:

 [[ $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 atsakė F. Khoury)

Ir užkliuvimui:

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

Taigi, paprastas pakaitinis variantas iš anksto įveikia išplėstinį testą ar atvejį. Byla yra nešiojama.

Vamzdynai iki 100 000 laipsnių yra nuspėjami skausmingi! Senoji taisyklė dėl išorinių paslaugų naudojimo nereikalinga.

38
27 авг. atsakymas, kurį pateikė Paulas Hedenantas 2014-08-27 22:42 '14, 10:42 pm 2014-08-27 22:42

Ji taip pat veikia:

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

Ir neigiamas testas:

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

Manau, kad šis stilius yra šiek tiek klasikinis, mažiau priklausomas nuo Bash apvalkalo savybių.

Šis argumentas -- gryna POSIX paranoija, naudojama apsaugoti nuo įvesties linijų, tokių kaip parametrai, pvz., --abc arba -a .

Pastaba Uždaroje kilpoje šis kodas bus daug lėčiau nei naudojant „Bash“ korpuso vidines funkcijas, nes vienas (arba du) atskiri procesai bus sukurti ir prijungti per kanalus.

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

Kaip apie tai:

 text=" <tag>bmnmn</tag> " if [[ "$text" =~ "<tag>" ]]; then echo "matched" else echo "not matched" fi 
13
09 февр. Atsakymas pateikiamas Stefan 09 vasario mėn. 2009-02-09 09:15 '09 9:15 am. 2009-02-09 09:15

Kaip Paulius pasakė savo veiklos palyginime:

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

Tai atitinka „POSIX“ reikalavimus, kaip „$“ eilutė „in“, kurią pateikė „Marcus“, bet ji šiek tiek lengviau skaitoma nei atsakymas į užklausą byloje. Taip pat atkreipkite dėmesį, kad tai bus daug lėčiau nei naudojant argumentą, kaip nurodė Paulius, nenaudokite to kilpa.

10
01 янв. atsakymą pateikė Samuel Jan 01 2015-01-01 01:32 '15 ne 1:32 2015-01-01 01:32

Ši perpildymo reakcija kaminai buvo vienintelė, galinti sugauti erdvę ir brūkšnelius:

 # For null cmd arguments checking to_check=' -t' space_n_dash_chars=' -' [[ $to_check == *"$space_n_dash_chars"* ]]  echo found 
9
26 авг. atsakymas duotas Yordan Georgiev 26 rug. 2013-08-26 13:13 '13, 13:13, 2013-08-26 13:13

Vienas iš jų:

 [ $(expr $mystring : ".*${search}.*") -ne 0 ]  echo 'yes' || echo 'no' 
8
11 нояб. Atsakymas pateikiamas chemilai, lapkričio 11 d. 2011-11-11 08:51 '11 at 8:51 2011-11-11 08:51

Bash4 +. Pastaba: nenaudokite kabučių, jei dėl žodžių yra tarpų ir kt. Visada nurodykite bash IMO.

Štai keletas Bash4 + pavyzdžių:

1 pavyzdys, pažymėkite eilutę „taip“ (atvejo nejautrus):

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

2 pavyzdys, pažymėkite eilutę „taip“ (atvejo nejautrus):

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

3 pavyzdys, pažymėkite „taip“ eilutėje (didžiosios ir mažosios raidės):

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

4 pavyzdys, pažymėkite „taip“ eilutėje (didžiosios ir mažosios raidės):

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

5 pavyzdys, tikslus atitikimas (didžiosios ir mažosios raidės):

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

6 pavyzdys, tikslus atitikimas (atvejo nejautrus):

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

7 pavyzdys: tikslus atitikimas:

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

8 pavyzdys, pakaitos simbolis atitinka .ext (atvejo nejautrus):

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

mėgautis

7
05 окт. Atsakymas, kurį pateikė Mike Q Oct 05 2018-10-05 21:54 '18, 21:54 2018-10-05 21:54
 [[ $string == *foo* ]]  echo "It there" || echo "Couldn't find" 
7
28 апр. Atsakymą pateikė Jahid 28 Bal 2015-04-28 22:55 '15, 10:55 val. 2015-04-28 22:55

grep -q yra naudingas šiam tikslui.

Tas pats su awk :

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

Išvada:

Nerasta

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

Išvada:

Rasta

Šaltinio šaltinis: http://unstableme.blogspot.com/2008/06/bash-search-letter-in-string-awk.html

4
21 дек. Jadu Saikia atsakymas gruodžio 21 d 2008-12-21 17:27 '08, 17:27 pm 2008-12-21 17:27

Man patinka sed.

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

Keisti, logika:

  • Naudokite sed, kad pašalintumėte antraštės egzempliorių iš eilutės.

  • Jei nauja eilutė skiriasi nuo senosios eilutės, yra eilutė

4
03 марта '16 в 22:12 2016-03-03 22:12 atsakymas duodamas važiuoti kovo 03 '16, 10:12 2016-03-03 22:12

Mano .bash_profile ir kaip aš naudoju grep, jei PATH įtraukė mano 2 bin dirs, nepridėkite jų

 # .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 янв. Atsakymą pateikė „ Leslie Satenstein“ sausio 14 d. 2017-01-14 08:36 '17 at 8:36 2017-01-14 08:36

Aš dažnai turėjau atlikti šią funkciją, todėl naudoju namų apvalkalo funkciją .bashrc kaip jis yra, kuris leidžia man jį naudoti taip dažnai, kaip man reikia, su lengva prisiminti pavadinimą:

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

Norėdami patikrinti, ar $string1 (pvz., $string1 ) yra $string1 (tarkim, abc), reikia tiesiog paleisti stringinstring "$string1" "$string2" ir patikrinti grąžinimo vertę, pvz.

 stringinstring "$str1" "$str2"  echo YES || echo NO 
3
01 июля '12 в 14:31 2012-07-01 14:31 Atsakymą pateikė Kurt Pfeifle liepos 1 d. 12 val. 15:31 2012-07-01 14:31

Tiksli žodžių atitiktis:

 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 atsakymas lapkričio 10 d. 2016-11-10 17:56 '16 at 17:56 pm 2016-11-10 17:56

Išbandykite oobash - tai styginių OO biblioteka, skirta bash 4. Jis parašytas bash. Yra daug funkcijų: -base64Decode , -base64Encode , -center , -charAt , -concat , -count , -endsWith , -equals , -equalsIgnoreCase , -reverse , -hashCode , -indexOf , -isAlnum , -indexOf , -isAlnum , -isAlpha , -isAscii , -isDigit , -isEmpty , -isHexDigit , -isLowerCase -swapCase , -toLowerCase , -toString , -toUpperCase , -trim ir -zfill .

Žr. Papildymo pavyzdį:

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

oobash galima rasti „Sourceforge.net“ .

2
27 авг. atsakymas į andreas 27 rug. 2010-08-27 22:19 '10, 10:19 PM 2010-08-27 22:19

Aš naudoju šią funkciją (viena priklausomybė nėra įtraukta, bet akivaizdu). Jis perduoda toliau pateiktus bandymus. Jei funkcija grąžina reikšmę> 0, tada buvo nustatyta eilutė. Taip pat galite lengvai grąžinti 1 arba 0.

 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 atsakymas balandžio 11 d 2018-04-11 05:09 '18, 17:09 val. 2018-04-11 05:09

Į klausimą buvo atsakyta čia: ngn-wiki.ru.site/questions/2769 / ...

Šis sprendimas veikia su specialiais simboliais:

 # 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 февр. Atsakymas, kurį pateikė Alex.Designworks 02 vasaris 2019-02-02 09:03 '19 at 9:03 2019-02-02 09:03

Kiti klausimai apie žymių arba Užduoti klausimą