「echo $ x | sed…」および「echo $ x | grep…」


14

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

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

または

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

正規表現を含む「foo」を検討してください。

私はそこにあるべきことを感じる-と最も可能性が高いです -フレーズ、この2つのコマンドとのパイプを伴うが、いくつかのよりコンパクトな表現に事をラップしていないものに良い方法。

見つけられません。誰か?


無知(代替を知らない)と保守性(代替を知っているが、理解しやすいようにこれを選択する)の組み合わせのために、この表現が頻繁に使用されることを期待しています。あなたの例が何をしているのか一目でわかりますが、grawityとDan McGの答えの代替案を見つけるためにシェルリファレンスが必要です。
いんちきキホーテ

3
ちなみに、コマンドの置換を行う好ましい方法$()は、バックティックよりもむしろです。
追って通知があるまで一時停止します。

2
その空白が保護されるように拡張を引用するのも良いアイデアですa="$(echo "$x" | sed "s/foo/bar/")"if echo "$x" | grep foo; …
クリスジョンセン

$()対 ``についての良いコメント。私のbashスキルはまだそれほど優れていません。
DevSolar

回答:


12

特定のシェルを想定していない限り、これを行うには「ツールにパイプエコー」(またはexprのような「ツール」自体)よりも良い方法はありません。従来のBourneシェルおよび/またはPOSIXシェルで本当に期待できるのはそれだけです。他のシェルを検討する場合、他の組み込みの可能性がいくつかあります。

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}パラメータ展開。

バッシュは持っています

  • extglob余分なパターンの最も有効にするオプションのkshを(なし{n}{n,m})。
  • expr == pattern(条件で[[ expr ]]テスト)。
  • ${param/pattern/replacement}パラメータ展開。
  • (新しいバージョンでは)拡張正規表現に一致するexpr =~ extregexp条件([[ expr ]]テストで)
    • 括弧で囲まれた部分式とBASH_REMATCHパラメーターを使用すると、sedスタイルの置換を実行できます。

zsh

  • EXTENDED_GLOBオプションを持つ独自の拡張パターン。
  • KSH_GLOBオプションを使用したkshのような拡張パターン。
  • expr == pattern(条件で[[ expr ]]テスト)。
  • ${pattern/pattern/replacement}パラメータ展開。
  • 拡張された正規表現と一致するexpr =~ extregexp条件([[ expr ]]テスト)。
    • RE_MATCH_PCREオプションが設定されている場合、プレーンな拡張正規表現の代わりにPCREを使用できます。
    • 括弧で囲まれた部分式とMATCHパラメータ、およびmatchパラメータ(またはBASH_REMATCHBASH_REMATCHオプションセット)、sedのスタイルの代替品を行うことができます。
  • zsh/pcreモジュール提供することpcre_compilepcre_studyおよびpcre_matchコマンドおよび-pcre-match テスト(条件で[[ expr ]]テスト)。
  • (テストで)テスト条件zsh/regexを提供するモジュール。-regex-match [[ expr ]]

ワオ。望みどおりの完成度。間違いなく勝者。
DevSolar

6

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

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

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

あなたの場合、それは

の代わりに:

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

使用を検討してください:

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

foo正規表現はどこにありますか。


これはどのシェルで機能しますか?
ペルチェ

1
if [ $x =~ foo ]ここにエラーメッセージが表示されます。if [[ $x =~ foo ]]、しかし、うまくいきます。ありがとう!
DevSolar

1
これらはすべてバシズムであり、バッシュが必要です。さらに、=~bash> = 3 iircが必要です。
チャフィンク

1
Iircも、fooはこれらの例では(PCREのような)正規表現ではありませんが、ワイルドカードを使用しています。これらのbashの良さについては、bashのマンページのセクション「パラメーター拡張」を参照してください。とのようなものに特に感謝${a##foo}してい${a%%bar}ます。
チャフィンク

3
マッチ演算子=~は正規表現を使用します。これは、たとえば、次のとおりです[[ "abcdddde" =~ ^a.*d+.g* ]](たとえば、g-wildcardではなく、ゼロ以上のgです)。
追って通知があるまで一時停止します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.