当我试图在代码中找到警告或错误的来源时,编译器的输出通常是经过预处理的,因此空白不再与原始代码中的空白相同。
有什么好方法可以用这样的空白来转换grep
模式:
grep 'data.frame(foo = x)' mycode
至
grep 'data.frame(foo *= *x)' mycode
一种可能性,我觉得有点难看:
PATTERN=`sed 's/ / */g' <(echo "test pattern") ` && grep $PATTERN mycode
代替:
grep 'data.frame(foo = x)' mycode
用途:
mygrep 'data.frame(foo = x)' mycode
其中mygrep
是一个文件,具有可执行位集,包含:
#!/bin/bash
declare -a options
for arg in "$@"
do
case "$arg" in
-*) options+=("$arg") ; shift ;;
*) break ;;
esac
done
grep "${options[@]}" "$(sed 's/ / */g' <(echo "$1"))" "$2"
所有的丑陋都藏在文件里。论点是一样的。(限制:对于选项及其参数由空格分隔的特殊情况,我还没有添加处理带有参数的选项的功能。)
怎么样
PATTERN=$(sed -r 's/s+/\s+/g' <<<"$PATTERN")
然后使用CCD_ 3以允许对空白使用扩展正则表达式特征CCD_。
或者一步到位:
egrep "$(sed -r 's/s+/\s+/g' <<<"$PATTERN")" mycode