2013-08-16 4 views
0
나는 .SQL 파일 이름에서 몇 가지 숫자를 추출해야

후 텍스트를 얻을 : "을 TDB_full_335.51_2013_02_14.sql"에서 난 단지 "2013_02_14는" 내가 이것을 얻을 수 있습니다 원하는 :4 자리 숫자를 찾아 그들을

echo $(find -s ~/Downloads | grep -e '\.sql' | awk -F/ '{print $NF}' | sed -n '/TDB_full/p' | awk 'END{print}' | awk '{gsub(".sql", "");print}' | cut -d "_" -f4 -f5 -f6) 

지금은 괜찮지만 파일 이름 길이가 변경되면 실패합니다. 4 자리 숫자 "2013"을 검색하고 ".sql"다음에 숫자를 가져 오는 방법이 있습니까?

이 발견하는 경우 :

grep -o '\([[:digit:]]\)\{4\}' 

을 만 나는 "2013"

+1

을 나는 켄 톰슨은 UNIX 철학으로 마음이 있다고 생각하지 않습니다. 그것은 내가 보아온 최악의 파이프 라인 중 하나입니다. –

답변

0

2013 및 인쇄 날짜 만의 Downloads 폴더에있는 모든 .sql 파일을 찾아 준다 :

$ find ~/Downloads -name "*.sql" | sed -r 's/.*(2013.*).sql/\1/' 
2013_02_14 

하는 경우 2013 :

년으로 제한하고 싶지는 않습니다. 10
$ find . -name "*.sql" | sed -r 's/.*([0-9]{4}_[0-9]{2}_[0-9]{2}).sql/\1/' 
2013_02_14 
0

0-9_과 같이 2013 년을 쉽게 일치시킬 수 있습니다. 당신은 같은 것을 사용 할 수 있도록 장기적으로 좋은 생각되지 않을 수도 있습니다 2013 하드 코딩을 사용하여

grep -o '\(2013[0-9_]*\)' 

;

grep -o '[0-9]\{4\}_[0-9]\{2\}_[0-9]\{2\}' 
0
당신은 그런 일을 사용할 수 있습니다

로 시작하는 4 자리 연도와 일치하도록 또는 sed의 GNU 버전을 사용하는 경우을 전달할 수 있습니다.옵션. 그럼 당신은 {}()을 탈출 할 필요가 없습니다 :

find -name '*.sql' \ 
| sed -r 's/.*_(([0-9]*_){2}[0-9]*)\.sql$/\1/' 
0

또 다른 sed 예 :

find -name '*.sql' \ 
| sed 's/.*_\(\([0-9]*_\)\{2\}[0-9]*\)\.sql$/\1/' 

grep -o '\(2[0-9]\{3\}_[0-9_]*\)' 

은 ... 2.

+0

놀라운 감사! :)) –

0
echo "TDB_full_335.51_2013_02_14.sql" | awk '{print substr($0,match($0,/2013/),10)}' 
2013_02_14