web-dev-qa-db-ja.com

「echo $ x | sed ...」および「echo $ x | grep ...」を実行するためのより良い方法

私はこれをスクリプトでよく見つけます(そして、私はそれを自分で書くことを認めなければなりません):

a=$(echo "$x" | sed "s/foo/bar/")

または

if echo "$x" | grep -q foo
then
    ...
fi

「foo」に正規表現を含めることを検討してください。

私は、これを表現するためのより良い方法があるはずだと感じています-そしておそらくis-2つのコマンドとパイプを含まないが、よりコンパクトな表現に変換します。

私はそれを見つけることができません。誰か?

14
DevSolar

特定のシェルを想定しない限り、これを行うには、「パイプエコーからツール」(または expr のような「ツール」自体)よりも優れた方法はありません。 =); traditional Bourne Shell および POSIX Shell を使用して、実際に信頼できるのはそれだけです。他のシェルを検討する場合、他のいくつかの組み込みの可能性があります。

ksh

  • 追加のパターン:?(pattern-list)*(pattern-list){n}(pattern-list){n,m}(pattern-list)@(pattern-list)!(pattern-list) ;
  • 拡張正規表現をパターンに変換するための%Pprintf指定子(および拡張正規表現をパターンに変換するための%R);
  • expr == patternテストの[[ expr ]]条件。
  • ${param/pattern/replacement}パラメーターの展開。

bash

  • kshの追加パターンのほとんどを有効にするextglobオプション({n}および{n,m}なし);
  • expr == pattern条件([[ expr ]]テストの場合);
  • ${param/pattern/replacement}パラメータ展開。
  • (新しいバージョンの場合)拡張正規表現と照合できるexpr =~ extregexp条件([[ expr ]]テストの場合)
    • 括弧で囲まれた部分式とBASH_REMATCHパラメータを使用すると、sedスタイルの置換を行うことができます。

zsh

  • EXTENDED_GLOBオプションを使用した独自の拡張パターン。
  • kshのような拡張パターンとKSH_GLOBオプション;
  • expr == pattern条件([[ expr ]]テストの場合);
  • ${pattern/pattern/replacement}パラメータ拡張。
  • 拡張正規表現と一致する可能性のあるexpr =~ extregexp条件([[ expr ]]テスト内)
    • rE_MATCH_PCREオプションが設定されている場合、プレーンな拡張正規表現の代わりに [〜#〜] pcre [〜#〜] を使用できます。
    • 括弧で囲まれた部分式、MATCHパラメーター、およびmatchパラメーター(またはBASH_REMATCHオプションが設定されたBASH_REMATCH)、sed-スタイルの置き換えを行うことができます。
  • zsh/pcrepcre_compilepcre_studyコマンドとpcre_matchtest条件を提供する-pcre-matchモジュール( [[ expr ]]テストで);
  • zsh/regextest条件を提供する-regex-matchモジュール([[ expr ]]テスト内)。
12
Chris Johnsen

Sed行を置き換えるには、次のようにします。

${a/foo/bar}または${a//foo/bar}

最初の形式では、最初のインスタンスのみが置き換えられます。 2番目の形式は、グローバル検索と置換です。

あなたの場合、それは

の代わりに:

if echo $x | grep foo
then
    ...
fi

次の使用を検討してください。

if [ $x =~ foo ]
then
    ...
fi

ここで、fooは正規表現です。

6
Dan McGrath

変数にパターンが含まれているかどうかをテストするための適切なposix互換の方法は次のとおりです。

test ${var##*foo*} || <do something>;

パラメータ拡張 の構文は次のとおりです。

 ${parameter##pattern}

ここで、patternシェルパターン です。

2
mrucci