ls lib/oracle-11.2.0.3.0.txt | sed 's/lib.\([oracle.*]\)\.txt/\1/'
它给出了整个字符串,而不仅仅是 oracle 部分,直到 .txt 我做错了什么?
我可以使用 awk 执行此操作,如下所示,但是不确定为什么 sed 没有给出想要的结果。
echo "lib/oracle-11.2.0.3.0.txt" | awk -F/ '{print substr($2,1,index($0,".txt")-1);}'
答案1
[oracle.*]
表示“字符o, r, a, c, l, e, ., 或*” 之一。因此,你的正则表达式只会匹配类似的东西
lib+c.txt
而不是您传递给它的实际文件名。如果您从正则表达式中删除[
and ]
,那么它将正常工作:
ls lib/oracle-11.2.0.3.0.txt | sed 's/lib.\(oracle.*\)\.txt/\1/'
然而,一种更简单的方法是
basename lib/oracle-11.2.0.3.0.txt .txt
或者,如果您确实希望文件来自stdin
:
ls lib/oracle-11.2.0.3.0.txt | xargs -I{} basename {} .txt
答案2
以下是执行此操作的更多方法:
珀尔
echo "lib/oracle-11.2.0.3.0.txt" | perl -pe 's/.+(oracle.+)\.txt/$1/'
sed
echo "lib/oracle-11.2.0.3.0.txt" | sed 's/.*\(oracle.*\)\.txt/\1/'
cut
echo "lib/oracle-11.2.0.3.0.txt" | cut -d'/' -f 2 | cut -d '.' -f 1-5
basename
和bash
echo "lib/oracle-11.2.0.3.0.txt" | while read n; do echo $(basename ${n/.txt//}); done
答案3
怎么样使用cut
echo "lib/oracle-11.2.0.3.0.txt" | cut -c5-19