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
이를 수행하는 추가 방법은 다음과 같습니다.
진주
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
답변3
사용하는 방법cut
echo "lib/oracle-11.2.0.3.0.txt" | cut -c5-19