如何将bash命令存储为多个替换的字符串?

时间:2014-07-30 16:41:05

标签: bash grep

我正在尝试清理这个脚本,这段代码让我感到烦恼,因为我知道它可能更干嘛:

if  grep --version | grep "GNU" > /dev/null  ;
then
    grep -P -r -l "\x0d" $dir | grep "${fileRegex}"
else
    grep -r -l "\x0d" $dir | grep "{$fileRegex}"
fi

我的想法是以某种方式有条件地将字符串变量设置为“grep -P”或“egrep”,然后在一行中执行以下操作:

$(cmdString) -r -l "\x0d" $dir | grep "${fileRegex}"

或类似的东西,但它不起作用。

3 个答案:

答案 0 :(得分:2)

您是否担心主持人GNU grepegrep?这样的主机存在吗?

如果没有,为什么不总是使用egrep? (虽然-Pegrep不是一回事。)

据说你不使用字符串(参见BashFAQ#50)。

您使用数组:grepcmd=(egrep)grepcmd=(grep -P)然后"${grepcmd[@]}" ...

如果您使用$'\r'或类似内容(假设您的shell了解该引用方法),您还可以完全避免需要perl模式。

答案 1 :(得分:0)

你可以这样做:

if  grep --version | grep "GNU" > /dev/null
then
    cmdString=(grep -P)
else
    cmdString=(egrep)
fi

"${cmdString[@]}" -r -l "\x0d" "$dir" | grep "{$fileRegex}"

答案 2 :(得分:0)

@Etan Reisner的建议运作良好。对于那些对最终代码感兴趣的人(这种情况适用于制表符,而不是windows行结尾,但它类似):

fileRegex=${1:-".*\.java"}

if grep --version | grep "GNU" > /dev/null ;
then
   cmdString=(grep -P)
else
   cmdString=(grep)
fi

arr=$("${cmdString[@]}" -r -l "\x09" . | grep "${fileRegex}")

if [ -n "$dryRun" ]; then
    for i in $arr; do echo "$i"; done
else
    for i in $arr; do expand -t 7 "$i" > /tmp/e && mv /tmp/e "$i"; done
fi