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);}'
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);}'
Answers:
[oracle.*]
装置“的一个字符o,r,a,c,l,e,.,或*”。因此,您的正则表达式只会匹配以下内容
lib+c.txt
而不是您要传递的实际文件名。如果从正则表达式中删除[
和]
,则可以正常工作:
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
这是其他几种方法:
佩尔
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