私はこれをスクリプトでよく見つけます(そして、私はそれを自分で書くことを認めなければなりません):
a=$(echo "$x" | sed "s/foo/bar/")
または
if echo "$x" | grep -q foo
then
...
fi
「foo」に正規表現を含めることを検討してください。
私は、これを表現するためのより良い方法があるはずだと感じています-そしておそらくis-2つのコマンドとパイプを含まないが、よりコンパクトな表現に変換します。
私はそれを見つけることができません。誰か?
特定のシェルを想定しない限り、これを行うには、「パイプエコーからツール」(または expr のような「ツール」自体)よりも優れた方法はありません。 =); traditional Bourne Shell および POSIX Shell を使用して、実際に信頼できるのはそれだけです。他のシェルを検討する場合、他のいくつかの組み込みの可能性があります。
kshは
?(pattern-list)
、*(pattern-list)
、{n}(pattern-list)
、{n,m}(pattern-list)
、@(pattern-list)
、!(pattern-list)
;%P
printf指定子(および拡張正規表現をパターンに変換するための%R
);expr == pattern
テストの[[ expr ]]
条件。${param/pattern/replacement}
パラメーターの展開。bashは
extglob
オプション({n}
および{n,m}
なし);expr == pattern
条件([[ expr ]]
テストの場合);${param/pattern/replacement}
パラメータ展開。expr =~ extregexp
条件([[ expr ]]
テストの場合)BASH_REMATCH
パラメータを使用すると、sedスタイルの置換を行うことができます。zshは
EXTENDED_GLOB
オプションを使用した独自の拡張パターン。KSH_GLOB
オプション;expr == pattern
条件([[ expr ]]
テストの場合);${pattern/pattern/replacement}
パラメータ拡張。expr =~ extregexp
条件([[ expr ]]
テスト内)MATCH
パラメーター、およびmatch
パラメーター(またはBASH_REMATCH
オプションが設定されたBASH_REMATCH
)、sed-スタイルの置き換えを行うことができます。zsh/pcre
、pcre_compile
、pcre_study
コマンドとpcre_match
test条件を提供する-pcre-match
モジュール( [[ expr ]]
テストで);zsh/regex
test条件を提供する-regex-match
モジュール([[ expr ]]
テスト内)。Sed行を置き換えるには、次のようにします。
${a/foo/bar}
または${a//foo/bar}
最初の形式では、最初のインスタンスのみが置き換えられます。 2番目の形式は、グローバル検索と置換です。
あなたの場合、それは
の代わりに:
if echo $x | grep foo
then
...
fi
次の使用を検討してください。
if [ $x =~ foo ]
then
...
fi
ここで、foo
は正規表現です。