0

でこぼこしたトピック名で申し訳ありません (問題を調べた後に適切なタイトルが見つかった場合は自由に編集してください)。コード サンプルは 1000 語に相当するため、次のようになります。

if [ "$REGEX" != "" ]; then
        find $TEST_DIR -type f -regextype posix-extended -regex '^.*(status|stderr|stdout)-captured$' |                                  
        grep -E $REGEX |
        awk '{print(""$1" "$1)}' | sed 's/-captured$/-expected/' | 
        while read -r line; do mv -f $line; done 
else
        find $TEST_DIR -type f -regextype posix-extended -regex '^.*(status|stderr|stdout)-captured$' |
        awk '{print(""$1" "$1)}' | sed 's/-captured$/-expected/' |
        while read -r line; do mv -f $line; done
fi

コードが何をするかはそれほど重要ではありません。「 grep -E $REGEX 」を使用するかどうかのよりエレガントな方法を見つけたいだけです。条件付きエイリアスは、シェルの使用に慣れているのと同じように機能すると思いましたが、スクリプト内では機能しません。

条件を付けることはできますが、複数の評価によるパフォーマンスへの影響が懸念されます。

コードを「よりエレガント」にする方法はありますか?

4

3 に答える 3

1

簡単な方法の 1 つは、設定されていないか空白の^場合に使用することです (これは常に一致します。すべての行にある「行の開始」を意味します) 。$REGEX

find $TEST_DIR -type f -regextype posix-extended -regex '^.*(status|stderr|stdout)-captured$' |
grep -E ${REGEX:-^} |
awk '{print(""$1" "$1)}' | sed 's/-captured$/-expected/' |
while read -r line; do mv -f $line; done

さらに言えば、それをオリジナルに組み合わせることができますfind

find $TEST_DIR -type f -regextype posix-extended \
     -regex '^.*(status|stderr|stdout)-captured$' \
     -regex ".*${REGEX}.*" |
awk '{print(""$1" "$1)}' | sed 's/-captured$/-expected/' |
while read -r line; do mv -f $line; done

さらに言えば、スクリプトの残りのすべてを次のようにマージすることもできますfind

find $TEST_DIR -type f -regextype posix-extended \
     -regex '^.*(status|stderr|stdout)-captured$' \
     -regex ".*${REGEX}.*" \
     -exec bash -c 'file="{}" ; mv -f "$file" "${file%-captured}-expected"' \;
于 2012-03-23T20:33:09.260 に答える
1

非常に簡単な解決策は次のとおりです。

test -n "$REGEX" && cmd="grep -E $REGEX"
find ... | ${cmd-cat} | awk ...

cmd が定義されている場合は、パイプで使用されます。それ以外の場合は、cat が使用され、ノーオペレーションが実行されます。次のこともできます。

find ... |
if test -n "$REGEX"; then
  grep -E $REGEX
else
  cat
fi |
awk ...

まったく同じ効果があります。

于 2012-03-23T20:31:36.113 に答える
0

これは少し醜いですが、一般的な解決策です。

find $TEST_DIR -type f -regextype posix-extended -regex '^.*(status|stderr|stdout)-captured$' \
 | if [ "$REGEX" != "" ]; then
        grep -E $REGEX; \
   else \
        cat; \
   fi \
 | awk '{print(""$1" "$1)}' \
 | sed 's/-captured$/-expected/' \
 | while read -r line; do mv -f $line; done 
于 2012-03-23T20:35:05.047 に答える