部分文字列と正規表現

部分文字列と正規表現

文字列を含む変数があり、他の部分文字列に基づいてその場所に基づいて部分文字列を抽出したいと思います。私の解決策は、文字列が関数にパラメータとして送信されない限り動作するようです。私はbashシェルを使用しています。

#!/usr/bin/bash

var0="-a check one two three"
var1="check"

function getsubstr() {
echo ${*#*"${2}"} 
}

# this prints 'one two three' which is what I want
echo ${var0#*"${var1}"}

# this prints '-a one two three', not what I want.
getsubstr $var0

echo $*関数を入れるとgetsubstr(->'-a check one two three') のような文字列が印刷され、関数を入れると (->'check') のような文字列が印刷されます。したがって、どちらの場合も、同じ部分文字列を印刷するように要求するようです。$var0echo $2getsubstr$var1

もう一つの困難は、私が使用している関数echo ${*#*"${2}"}にない場合でも同じ結果を得ることです。getsubstrecho ${*%"${2}"*}

この動作を理解していただきありがとうございます。

${*:3}ところで、関数内でgetsubstr私が望む部分文字列を返すことは可能であることを知っていますが、理解して#*<regexp>行動%<regextp>*しようとしています。

ベストアンサー1

getsubstr $var05つのパラメータを関数に渡しています。
また、$ *と$ @は両方をテストします。$1$2$ など...引数オブジェクト#柄。

正規表現についてbash:最後にいくつかの例を追加しました。ところで、「*」はただ特殊正規表現文字正規表現のコンテキストで使用される場合、つまり。使用するとき =~。 * in が初めて使用されるときに${*アスタリスクを特別に使用する方法は次のとおりです。(医師)名var はすべての変数の連結に拡張されます: $1 $2 $... etc...
アスタリスクの 2 番目の使用は次のことを#*"${2}"意味します。"$2"の前には何もありません、渡された各 $1 などの引数と個別に/個別に一致します。

次のスクリプトは $@ や $* (例:) に役立ちます。

#!/bin/bash
#   
getsubstr() {
  echo -n " ${#@} args";
  [[ "$1$2$3$4$5$6" == *\ * ]] && echo " (with embedded spaces)" || echo " (no spaces)"
  echo '                  "${*}"          '\|"${*}"\|
  echo '                   ${*}           '\|${*}\|
  echo '                  "${@}"          '\|"${@}"\|
  echo '                   ${@}           '\|${@}\|
  echo '                  "${*#*"${2}}"   '\|"${*#*"${2}"}"\|
  echo '                   ${*#*"${2}}    '\|${*#*"${2}"}\|
  echo '                  "${@#*"${2}}"   '\|"${@#*"${2}"}"\|
  echo '                   ${@#*"${2}}    '\|${@#*"${2}"}\|
  echo '                        ${*#B}    '\|${*#B}\|
  echo '                       "${*#B}"   '\|"${*#B}"\|
  echo '                        ${@#B}    '\|${@#B}\|
  echo '                       "${@#B}"   '\|"${@#B}"\|
}
var0="a B c      "
echo
echo -n "Passing "; getsubstr "$var0" ; echo
echo -n "Passing "; getsubstr  $var0  ; echo
echo -n "Passing "; getsubstr "$var0" "$var0" ; echo
echo -n "Passing "; getsubstr  $var0   $var0  ; echo
echo
exit 
###################################################################

正規表現bash

# Regex checks: "=~" uses extended regular expression
#+  Parenthesized subexpressions within the regular expression are saved
#+  in the array variable BASH_REMATCH
#+  $BASH_REMATCH / ${BASH_REMATCH[0]} is the string matching the entire regular expression. 
#+  ${BASH_REMATCH[n]} is the sub string matching the nth parenthesized subexpression

  [[ "abcdef" =~ (.)(.)(.) ]] && echo "# $BASH_REMATCH"
# abc

  [[ "abcdef" =~ (.)(.)(.) ]] && echo "# ${BASH_REMATCH[0]}"
# abc

  [[ "abcdef" =~ (.)(.)(.) ]] && echo "# ${BASH_REMATCH[2]}"
# b

  [[ "abcdef" =~ (.)(.)(.) ]] && echo "# ${BASH_REMATCH[@]}"
# abc a b c

おすすめ記事