sed를 사용하여 문자열의 일부 추출

sed를 사용하여 문자열의 일부 추출
ls lib/oracle-11.2.0.3.0.txt | sed 's/lib.\([oracle.*]\)\.txt/\1/'

.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

실제 파일 이름 대신 전달합니다. 정규식에서 [및 를 제거하면 ]제대로 작동합니다.

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. 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

관련 정보