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


9
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:


12

[oracle.*]装置“的一个字符oracle.,或*”。因此,您的正则表达式只会匹配以下内容

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

7

这是其他几种方法:

  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
    

1

怎么样使用 cut

echo "lib/oracle-11.2.0.3.0.txt" | cut -c5-19
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.