2010-03-28 5 views
0

디렉터리로 이동하여 정규식과 일치하는 각 파일 (특히 Test[0-9]*.txt)과 함께 내 응용 프로그램을 실행하는 스크립트를 만들려고합니다.원본 파일 이름의 변수 부분을 유지하는 파일의 이름을 바꾸는 방법

입력 파일 이름은 TestXX.txt입니다. 자, 및 .txt을 잘라내어 잘라낼 수는 있지만 XX이 두 자리로 미리 정의되지 않은 경우 어떻게해야합니까? Test1.txt, ..., Test10.txt이 있으면 어떻게됩니까? 즉, [0-9]* 부분을 어떻게 얻을 수 있습니까? 그냥 알다시피

, 나는 OutputXX.txt :

편집 할 수 있도록하려면 :

내가 이름 Test[0-9]*.txt와 파일이와 나는 Output[0-9]*.txt

+0

@Buttink, 문제는 당신이 그것을 편집 할 수 있습니다, 제대로 의미를 전달하지 않는 것? –

+0

@ 칼루 "간단하게"유지하는 질문을 편집하면 XP – Buttink

+0

을 더 쉽게 이해할 수 있습니다. 관련 질문 : [여러 패턴을 기반으로 파일의 이름을 바꾸는 더 나은 방법] (http://stackoverflow.com/a/25597051/2654678)). –

답변

2

겠습니까 뭔가를하는 데 도움이

http://www.grymoire.com/Unix/Sed.html#uh-4

희망?

#!/bin/bash 
for f in Test*.txt ; 
do 
    process < $f > ${f/Test/Output} 
done 

Bash Shell Parameter Expansion

+0

이것은 효과가 있습니다! Im 어리 석고 아직도 나의 과정을 달리는 방법 파악하는 것을 시도하고있다 그러나 다른 문제 thats. – Buttink

+0

@keith,이 방법이 효과가 있었지만 숫자가 아닌 모든 경우에 사용할 수 있습니다.'TestABC.txt'도 처리하려고합니까? – ghostdog74

+1

+1. 'process <"$f" > "$ {f/Test/Output}"'을 인용하는 것을 잊지 마십시오. 이 매개 변수 확장도 작동합니다 :'$ {f # Test}''출력 –

1

에 문자열을 조작하려는 당신 지키고 싶은 부분을 둥근 괄호로 묶어야합니다.

즉, "테스트 ([0-9] *) TXT."

이 괄호 그룹을 교체하는 구문은 프로그램 사이에서 변화하지만, 당신은 아마 당신이 \ 1을 사용할 수 있습니다 찾을 수 있습니다, 이런 식으로 뭔가 :

S/테스트 (0-9 *). TXT/출력 \의 1.TXT/

당신이 변환을 수행하기위한 가장 좋은 건 수 있습니다 후 '나오지도'유닉스 쉘을 사용하는 경우. 이 도움말과 같은

+0

두 가지 대답을 설정할 수 없습니다. 하나는 간단하고 다른 하나는 더 확장 가능>. 게이 – Buttink

2

bash는 정규 표현식에에 좋은 튜토리얼 here입니다. 요약하면 다음과 같은 것이 필요합니다.

if [[$filenamein =~ "^Test([0-9]*).txt$"]]; then 
    filenameout = "Output${BASH_REMATCH[1]}.txt" 

등이 필요합니다. 핵심은 =~" regex-match, the "sub-matches" to parentheses-enclosed groups in the RE are set in the entries of array BASH_REMATCH (the [0] entry is the whole match,1`첫 번째 괄호로 묶인 그룹 등을 수행 할 때입니다.

0
for file in Test[0-9]*.txt; 
do 
num=${file//[^0-9]/} 
process $file > "Output${num}.txt" 
done 
관련 문제