2017-01-15 63 views
0

我有一堆需要使用自定義字典進行翻譯的文件。每個文件都包含一行指示使用哪個字典。這裏有一個例子:使用多個字典更改文本文件中的單詞

*A: 
! 
=1 
*>A_intro 
1r 
=2 
1r 
=3 
1r 
=4 
1r 
=5 
2A:maj 
*- 

在上面的文件,*A:表示使用dictA

我可以很容易地使用下面的語法翻譯這一部分:

sed -f dictA < myfile 

我的問題是,一些文件需要的字典一半在文本的變化。例如:

*B: 
1B:maj 
2E:maj/5 
2B:maj 
2E:maj/5 
*C: 
2F:maj/5 
2C:maj 
2F:maj/5 
2C:maj 
*- 

我想寫一個腳本來自動化翻譯過程。使用此示例,我希望腳本讀取第一行,選擇dictB,使用dictB翻譯每行,直到它讀取*C:,選擇dictC,然後繼續。

+2

我建議從這樣的事情開始:'while IFS = read -r line;做回聲「用$行做某事」;完成 Cyrus

回答

0

謝謝@Cyrus。這很有用。這是我最終做的。

#!/bin/sh 
key="sedDictNull.txt" 
while read -r line || [ -n "$line" ] ## Makes sure that the last line is read. See http://stackoverflow.com/questions/12916352/shell-script-read-missing-last-line 
do 
     if [[ $line =~ ^\*[Aa]:$ ]] 
     then 
     key="sedDictA.txt" 
     elif [[ $line =~ ^\*[Aa]#:$ ]] 
     then 
     key="sedDictA#.txt" 
     fi 
     echo "$line" | sed -f $key 
done < $1 
0

我假設你的 「字典」 是真的sed腳本,搜索和替換,就像這樣:

s/2C/nothing/; 
s/2B/something/; 

你可以重新組織這些腳本段,像這樣:

/^\*B:/, /^\*[^B]/ { 
    s/1B/whatever/; 
    s/2B/something/; 
} 
/^\*C:/, /^\*[^C]/ { 
    s/2C/nothing/; 
    s/2B/something/; 
} 

當然,你可以在飛行中做到這一點:

for dict in B C 
    do echo "/^\\*$dict:/, /^\\*[^$dict]/ {" 
    cat dict.$dict 
    echo "}" 
done | sed -f- dict.in 
相關問題