2010-03-28 140 views
0

我試圖製作一個腳本,該腳本將進入一個目錄並運行我自己的應用程序,每個文件都與正則表達式匹配,特別是Test[0-9]*.txt。我的輸入文件名如下所示。現在,我可以使用剪切和砍掉Test.txt,但如果XX未預定義爲兩位數,我將如何執行此操作?如果我有Test1.txt,...,Test10.txt,我該怎麼辦?換句話說,我如何得到[0-9]*部分?如何重命名保留原文件名的可變部分的文件

只要你知道,我希望能夠做一個OutputXX.txt :)

編輯:

我有一個文件名Test[0-9]*.txt文件,我想字符串處理成Output[0-9]*.txt

+0

@Buttink,這個問題似乎沒有正確傳達意思,你能編輯它嗎? – 2010-03-28 23:02:41

+0

@Kalu我編輯了「保持簡單」類型的問題將使它更容易理解XP – Buttink 2010-03-28 23:09:43

+0

相關問題:[更好的方式來重命名基於多個模式的文件](http://stackoverflow.com/a/25597051/2654678 )。 – 2014-08-31 23:15:14

回答

2

會是這樣的幫助呢?

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

Bash Shell Parameter Expansion

+0

這工作!我很愚蠢,我仍然試圖弄清楚如何讓我的流程運行,但那是另一回事。 – Buttink 2010-03-28 23:19:36

+0

@keith,這個工作,但它適用於所有情況下,不只是數字..你是否打算處理'TestABC.txt'以及? – ghostdog74 2010-03-28 23:53:29

+1

+1。不要忘記引用:'process <"$f" >「$ {f/Test/Output}」'。這個參數擴展也可以工作:''Output $ {f#Test}「' – 2014-05-08 18:11:07

1

你需要在要保留的部分周圍使用圓括號。

即「測試([0-9] *)TXT。」

更換這些括號組的語法項目之間變化,但你可能會發現你可以使用\ 1,這樣的事情:

S /測試(0-9 *)。TXT /輸出\的1.txt/

如果您使用的是Unix外殼,那麼 'sed的' 可能是執行轉換你最好的選擇。

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

希望幫助

+0

看起來不錯,我不能設置兩個答案。一個很簡單,另一個更可擴展>。> gay – Buttink 2010-03-28 23:21:05

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