2016-11-30 54 views
0

我有dictionaries名單,由名爲index兩個文件擴展名{aff,dic}正則表達式中sed來匹配路徑的子路徑與捕獲組

dictionaries/dictionaries/bg_BG/index.dic 
dictionaries/dictionaries/ca_ES/index.dic 
dictionaries/dictionaries/cs_CZ/index.dic 
dictionaries/dictionaries/da_DK/index.dic 
... 
dictionaries/dictionaries/bg_BG/index.aff 
dictionaries/dictionaries/ca_ES/index.aff 
dictionaries/dictionaries/cs_CZ/index.aff 
dictionaries/dictionaries/da_DK/index.aff 

量身定做的,我希望他們在不同的文件夾複製,但爲了命名每個的通過像it_IT子路徑有

myDicts/it_IT.dic 
myDicts/it_IT.acc 

我來到了這個在線

for file in dictionaries/dictionaries/**/*.{dic,aff}; do echo ${file}; done 

列出這些文件夾中的文件,在$file中有for...loop變量dictionaries/dictionaries/da_DK/index.aff

因此,使用sed我能夠選擇時(排除)的模式,比如

sed 's:[a-z][a-z][_-][A-Z][A-Z]::'; 

所以有

for file in dictionaries/dictionaries/**/*.{dic,aff}; do echo ${file} | sed 's:[a-z][a-z][_-][A-Z][A-Z]::'; done 

,這一次將打印出

dictionaries/dictionaries//index.dic 
dictionaries/dictionaries//index.dic 
dictionaries/dictionaries//index.dic 
... 
dictionaries/dictionaries//index.aff 
dictionaries/dictionaries//index.aff 
dictionaries/dictionaries//index.aff 

對於我瞭解我知道sed打印出捕獲組需要指定捕獲組和非捕獲部分 - 見here

但我無法弄清楚如何才能實現這一目標,在年底

bg_BG.acc 
ca_ES.acc 
da_DK.acc 
... 
bg_BG.dic 
ca_ES.dic 
da_DK.dic 

有在$file凡拓{acc,dic}應也添加了。 我需要執行此命令內聯腳本的原因。

[更新] 多虧了答案下面我想出了這個解決方案

for file in dictionaries/dictionaries/**/*.{dic,aff}; do echo $file | sed 's:.*\([a-z][a-z][_-][A-Z][A-Z]\)/index\(.*\):cp & myDicts/\1\2:' | sh; done 

是它的工作:

$ ls myDicts/ 
bg_BG.aff cs_CZ.aff de_AT.aff de_DE.aff en_AU.aff en_GB.aff en_ZA.aff eu_ES.aff gl_ES.aff it_IT.aff mn_MN.aff nl_NL.aff pl_PL.aff pt_PT.aff ru_RU.aff sl_SI.aff sv_SE.aff uk_UA.aff 
bg_BG.dic cs_CZ.dic de_AT.dic de_DE.dic en_AU.dic en_GB.dic en_ZA.dic eu_ES.dic gl_ES.dic it_IT.dic mn_MN.dic nl_NL.dic pl_PL.dic pt_PT.dic ru_RU.dic sl_SI.dic sv_SE.dic uk_UA.dic 
ca_ES.aff da_DK.aff de_CH.aff el_GR.aff en_CA.aff en_US.aff es_ES.aff fr_FR.aff hr_HR.aff lb_LU.aff nb_NO.aff nn_NO.aff pt_BR.aff ro_RO.aff sk_SK.aff sr_RS.aff tr-TR.aff vi_VN.aff 
ca_ES.dic da_DK.dic de_CH.dic el_GR.dic en_CA.dic en_US.dic es_ES.dic fr_FR.dic hr_HR.dic lb_LU.dic nb_NO.dic nn_NO.dic pt_BR.dic ro_RO.dic sk_SK.dic sr_RS.dic tr-TR.dic vi_VN.dic 

只有一個缺陷就是它不捕獲這些路徑模式

dictionaries/dictionaries/ca_ES-valencia/ 
dictionaries/dictionaries/sr_RS-Latn 
dictionaries/dictionaries/ca_ES-valencia/ 
dictionaries/dictionaries/sr_RS-Latn/ 

回答

1

這裏有一個辦法:

echo dictionaries/dictionaries/da_DK/index.aff | 
    sed 's:.*\([^/]\+\)/index\(\..*\):\1\2:' 

輸出:

da_DK.aff 

然而,有一個更快的方法比for循環:

find dictionaries/dictionaries -name "index.dic" -or -name "index.aff" | 
    sed 's:dictionaries/dictionaries/\([^/]\+\)/index\(\..*\):mv & myDicts/\1\2:' 

如果產生你想要的命令,它管sh

mkdir myDicts 
find dictionaries/dictionaries -name "index.dic" -or -name "index.aff" | 
    sed 's:dictionaries/dictionaries/\([^/]\+\)/index\(\..*\):mv & myDicts/\1\2:' | 
    sh 
+0

感謝它的工作!我錯過了一些模式,比如'dictionaries/dictionaries/ca_ES-valencia/index.aff','dictionaries/dictionaries/sr_RS-Latn/index.dic','dictionaries/dictionaries/sr_RS-Latn/index.aff'等。如何添加此組? – loretoparisi

+0

btw第一個命令它的工作,出於某種原因,我得到了一個'sh:第72行:字典/詞典/ tr-TR/index.dic:Permission denied'在'find'到'sh'的管道中。 – loretoparisi

+0

試過這種方式:'用於字典/詞典中的文件/ **/*。{dic,aff};做$ file | sed's:。* \([a-z] [a-z] [_-] [A-Z] [A-Z] \)/ index \(。* \):cp&myDicts/\ 1 \ 2:';完成「,但現在也」拒絕了「權限。 – loretoparisi