正则表达式中sed来匹配路径的子路径与捕获组
问题描述:
我有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/
答
这里有一个办法:
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
感谢它的工作!我错过了一些模式,比如'dictionaries/dictionaries/ca_ES-valencia/index.aff','dictionaries/dictionaries/sr_RS-Latn/index.dic','dictionaries/dictionaries/sr_RS-Latn/index.aff'等。如何添加此组? – loretoparisi
btw第一个命令它的工作,出于某种原因,我得到了一个'sh:第72行:字典/词典/ tr-TR/index.dic:Permission denied'在'find'到'sh'的管道中。 – loretoparisi
试过这种方式:'用于字典/词典中的文件/ **/*。{dic,aff};做$ file | sed's:。* \([a-z] [a-z] [_-] [A-Z] [A-Z] \)/ index \(。* \):cp&myDicts/\ 1 \ 2:';完成“,但现在也”拒绝了“权限。 – loretoparisi