使用 sed 提取字符串的一部分

使用 sed 提取字符串的一部分
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

以下是执行此操作的更多方法:

  1. 珀尔

    echo "lib/oracle-11.2.0.3.0.txt" | perl -pe 's/.+(oracle.+)\.txt/$1/'
    
  2. sed

    echo "lib/oracle-11.2.0.3.0.txt" | sed 's/.*\(oracle.*\)\.txt/\1/'
    
  3. cut

    echo "lib/oracle-11.2.0.3.0.txt" | cut -d'/' -f 2 | cut -d '.' -f 1-5
    
  4. basenamebash

    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

相关内容