output=`grep -R -l "${images}" *`
new_output=`regex "slide[0-9]" $output`
基本上$ output是这样的字符串:
幻灯片/ _rels / slide9.xml.rels
$ output中的数字会改变。我想抓住“slide9”并将其放入变量中。我希望new_output可以做到这一点,但我得到一个未找到使用正则表达式的命令。还有其他选择吗?我正在使用bash shell脚本。
答案 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