2012-08-12 160 views
0

我有兩個文件夾,裏面裝滿了培訓和相應的測試文件,我想用shell腳本運行配對對方。Shell腳本:截斷字符串

這是我到目前爲止有:

for x in SpanishLS.train/*.train 
do 
    timbl -f $x -t SpanishLS.test/$x.test 
done 

這應該採取file1(-n).train在一個目錄下,在其他尋找file1(-n).test,並運行它們低谷名爲timbl工具。 它所做的是找一個名爲SpanishLS.train/file1(-n).train.test的文件,這當然不存在。 我試圖做的,無濟於事,截斷$x的方式,讓腳本找到正確的文件,但每當我這樣做,$x被截斷的方式太早,導致腳本甚至找不到.train文件。

我該如何編碼?

回答

2

使用basename

for x in SpanishLS.train/*.train 
do 
    timbl -f $x -t SpanishLS.test/$(basename "$x" .train).test 
done 

即刪除該目錄前綴,從$x.train後綴,並建立所需要的名字。

bash(和其他POSIX-compliant shells),你可以用兩個殼parameter expansionsbasename操作,而不調用外部程序。 (我不認爲有一種方法將兩個擴展合二爲一。)

for x in SpanishLS.train/*.train 
do 
    y=${x##*/}          # Remove path prefix 
    timbl -f $x -t SpanishLS.test/${y%.train}.test # Remove .train suffix 
done 

當心:bash支持相當多的不是由POSIX定義的(有用的)擴展。例如,${y//.train/.test}bash-只是表示法(或bash和兼容的shell表示法)。

+0

的換人不僅猛砸,但是POSIX SH ,不是嗎? – tripleee 2012-08-12 18:07:07

+0

@tripleee嗯......是的,'##'和'%'(和'#'和'%%')擴展在[POSIX shell]中(http://pubs.opengroup.org/onlinepubs/9699919799 /utilities/V3_chap02.html#tag_18_06_02)。其他地方的評論建議'$ {x //。train/.test}';這不是POSIX擴展。我已經更新了我的答案 - 感謝您指出了這一點。 – 2012-08-12 18:09:53

+0

謝謝!這比我想象的更加優雅! – lhausmann 2012-08-12 18:28:24

0

在文件名替換的.train所有出現到.text

timbl -f $x -t $(echo $x | sed 's/\.train/.text/g') 
+0

可以在bash中執行此操作:'-t $ {x //。train/.test}' – 2012-08-12 18:03:44

+0

這不涉及'SpanishLS.train'和'SpanishLS.test'路徑前綴。 – 2012-08-12 18:06:38

4

如果我給你的權利,這將做的工作:

for x in SpanishLS.train/*.train 
do 
    y=${x##*/} # strip basepath 
    y=${y%.*} # strip extention 
    timbl -f $x -t SpanishLS.test/$y.test 
done