我正在尝试清理这个脚本,这段代码让我感到烦恼,因为我知道它可能更干嘛:
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}"
或类似的东西,但它不起作用。
答案 0 :(得分:2)
您是否担心主持人GNU grep
但egrep
?这样的主机存在吗?
如果没有,为什么不总是使用egrep
? (虽然-P
和egrep
不是一回事。)
据说你不使用字符串(参见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)
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