把正则表达式放在变量中

时间:2011-06-24 13:32:58

标签: regex linux bash terminal

output=`grep -R -l "${images}" *`
new_output=`regex "slide[0-9]" $output`

基本上$ output是这样的字符串:

幻灯片/ _rels / slide9.xml.rels

$ output中的数字会改变。我想抓住“slide9”并将其放入变量中。我希望new_output可以做到这一点,但我得到一个未找到使用正则表达式的命令。还有其他选择吗?我正在使用bash shell脚本。

3 个答案:

答案 0 :(得分:2)

好吧,正则表达式不是像grep这样的程序。 ;)

但你可以使用

 grep -Eo "(slide[0-9]+)"

作为一种简单的方法。 -o表示:仅显示匹配部分,-E表示:扩展正则表达式(允许更复杂的模式)。

答案 1 :(得分:0)

阅读我想抓住“slide9”并把它放在一个变量中。我认为你想要的东西与你的正则表达式匹配是{strong>唯一的放在{{1 }}?如果是,那么您可以将其更改为:

$new_output

请注意,不需要设置new_output=`egrep -R -l "${images}" * | sed 's/.*\(slide[0-9]+\).*/\1/'` (除非您将其用于其他内容) 如果您需要在其他地方使用output=,请改为使用:

$output

sed的///命令类似于perls s //命令,并且在大多数语言中都具有相同的功能。

此处我在output=`grep -R -l "${images}" *` new_output=`echo ${ouput} | sed 's/.*\(slide[0-9]+\).*/\1/'` 之前和之后匹配零个或多个字符.*,然后在sed中记住(反向渲染)结果slide[0-9]+(括号可能需要也可能不需要根据sed的版本进行转义)。然后我们用\( ... \)替换整个匹配(即整行),扩展到第一个捕获的结果,在这种情况下是\1匹配。

答案 2 :(得分:0)

在这些使用awk的情况下更好:

output="`grep -R -l "main" codes`"
echo $output
tout=`echo $output | awk -F. '{for(i=1;i<=NF;i++){if(index($i,"/")>0){n=split($i,ar,"/");print ar[n];}}}'`
echo $tout

这将打印没有扩展名的文件名。如果您只想使用slide9而不是使用其他人提供的解决方案。

示例输出:

A@A-laptop ~ $ bash try.sh
codes/quicksort_iterative.cpp codes/graham_scan.cpp codes/a.out
quicksort_iterative graham_scan a