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

wou*_*non 9 sed regular-expression

ls lib/oracle-11.2.0.3.0.txt | sed 's/lib.\([oracle.*]\)\.txt/\1/'
Run Code Online (Sandbox Code Playgroud)

它给出了整个字符串,而不仅仅是 oracle 部分,直到 .txt 我做错了什么?

我可以按如下方式使用 awk 来完成,但是,不确定为什么 sed 没有给出想要的结果。

echo "lib/oracle-11.2.0.3.0.txt" | awk -F/ '{print substr($2,1,index($0,".txt")-1);}'
Run Code Online (Sandbox Code Playgroud)

ric*_*ici 12

[oracle.*]表示“其中一个字符o, r, a, c, l, e, ., , 或*”。因此,您的正则表达式只会匹配类似

lib+c.txt
Run Code Online (Sandbox Code Playgroud)

而不是您传递的实际文件名。如果您从正则表达式中删除[],那么它将正常工作:

ls lib/oracle-11.2.0.3.0.txt | sed 's/lib.\(oracle.*\)\.txt/\1/'
Run Code Online (Sandbox Code Playgroud)

然而,一个更简单的方法是

basename lib/oracle-11.2.0.3.0.txt .txt
Run Code Online (Sandbox Code Playgroud)

或者,如果您真的希望文件来自stdin

ls lib/oracle-11.2.0.3.0.txt | xargs -I{} basename {} .txt
Run Code Online (Sandbox Code Playgroud)


ter*_*don 7

以下是执行此操作的其他几种方法:

  1. 珀尔

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

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

    echo "lib/oracle-11.2.0.3.0.txt" | cut -d'/' -f 2 | cut -d '.' -f 1-5
    
    Run Code Online (Sandbox Code Playgroud)
  4. basenamebash

    echo "lib/oracle-11.2.0.3.0.txt" | while read n; do 
      echo $(basename ${n/.txt//}); 
    done
    
    Run Code Online (Sandbox Code Playgroud)