首页 > 解决方案 > 用列表中的 sed 替换子目录中的文件条目

问题描述

我想替换一大堆文档中的某一行(#6),如下所示:

N  Metal1 Metal2 Metal3 Metal4

其中金属需要用排列列表中的化学符号替换:

CrHfMoNb CrHfMoTa CrHfMoTi CrHfMoV CrHfMoW CrHfMoZr CrHfNbTa CrHfNbTi CrHfNbV CrHfNbW CrHfNbZr CrHfTaTi CrHfTaV CrHfTaW CrHfTaZr CrHfTiV CrHfTiW CrHfTiZr CrHfVW CrHfVZr CrHfWZr CrMoNbTa CrMoNbTi CrMoNbV CrMoNbW CrMoNbZr CrMoTaTi CrMoTaV CrMoTaW CrMoTaZr CrMoTiV CrMoTiW CrMoTiZr CrMoVW CrMoVZr CrMoWZr CrNbTaTi CrNbTaV CrNbTaW CrNbTaZr CrNbTiV CrNbTiW CrNbTiZr CrNbVW CrNbVZr CrNbWZr CrTaTiV CrTaTiW CrTaTiZr CrTaVW CrTaVZr CrTaWZr CrTiVW CrTiVZr CrTiWZr CrVWZr HfMoNbTa HfMoNbTi HfMoNbV HfMoNbW HfMoNbZr HfMoTaTi HfMoTaV HfMoTaW HfMoTaZr HfMoTiV HfMoTiW HfMoTiZr HfMoVW HfMoVZr HfMoWZr HfNbTaTi HfNbTaV HfNbTaW HfNbTaZr HfNbTiV HfNbTiW HfNbTiZr HfNbVW HfNbVZr HfNbWZr HfTaTiV HfTaTiW HfTaTiZr HfTaVW HfTaVZr HfTaWZr HfTiVW HfTiVZr HfTiWZr HfVWZr MoNbTaTi MoNbTaV MoNbTaW MoNbTaZr MoNbTiV MoNbTiW MoNbTiZr MoNbVW MoNbVZr MoNbWZr MoTaTiV MoTaTiW MoTaTiZrMoTaVW MoTaVZr MoTaWZr MoTiVW MoTiVZr MoTiWZr MoVWZr NbTaTiV NbTaTiW NbTaTiZr NbTaVW NbTaVZr NbTaWZr NbTiVW NbTiVZr NbTiWZr NbVWZr TaTiVW TaTiVZr TaTiWZr TaVWZr TiVWZr

让它看起来像这样:

N  Cr Hf Mo Nb 

我可以使用 sed 命令轻松地做到这一点:

sed -i '6s/Metal1 Metal2 Metal3 Metal4/Cr Hf Mo Nb/' filename`

问题是我需要为所有 126 种组合自动执行此操作,其中每个文件都位于每个组合的自己的子目录中,并且必须根据自己的元素进行相应调整。该文件始终具有相同的名称,并且在此更改之前完全相同。
化学符号必须按字母顺序列出,并且每个之间必须有一个空格,否则代码将不起作用。我认为这很困难,因为除了 V 之外,所有使用的元素的符号中都有两个字母。有没有一种有效的方法来做到这一点?

标签: sed

解决方案


处理两字符 (Zr) 一字符 (W) 问题很容易。每个大写字母都标志着一个新元素的开始。

cd dir/
for dir in *N; do
    split="$(sed 's/N$//;s/[A-Z]/ &/g' <<< "$dir")"
    sed -i "s/N  Metal1 Metal2 Metal3 Metal4/N $split/" "$dir/file"
done

请注意,它$split以空格开头,因此替换字符串就像在和N Cr Hf Mo Nb之间有两个空格一样- 就像你想要的那样。NCr


推荐阅读