2012-03-23 86 views
0

对于颠簸的主题名称感到抱歉(如果在查看问题后发现更合适的标题,请随时编辑)。 代码示例等于1000分的话,那么在这里我们去:有条件的命令在bash中的管道命令序列中执行

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 $正则表达式”或不。我认为条件化别名可以像我习惯使用shell一样完成这项工作,但它们在脚本中不起作用。

我可以放入一个条件,但我担心来自多个评估的性能影响。

任何方式来使代码“更优雅”?

+0

你能描述一下你想要的输入/输出好一点吗? – 2012-03-23 20:30:25

+0

@CarlNorum不要认为这是必要的,但我应该:首先找到匹配名称'{status,stderr,stdout)-captured'的文件的打印路径,然后这些进一步被'grep -E $ REGEX'过滤。 awk,sed和read,组装这个例子: './dir/status-captured'到执行的'mv ./dir/status-captured。/ dir/status-expected'中。 – AoeAoe 2012-03-23 20:36:11

回答

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"' \; 
+0

有趣的是,第一个变体在我的测试树中表现最好。 谢谢你真正有趣的答案。 – AoeAoe 2012-03-23 21:02:31

+0

@AoeAoe:不客气! – ruakh 2012-03-23 21:06:27

1

一个很简单的解决办法是:

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

如果CMD被定义,它在管中使用。否则,使用cat,执行no-op。 你也可以这样做:

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

完全一样的效果。

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