首页 > 解决方案 > 如何在循环中替换文件中的字符串并运行命令

问题描述

我想替换一个名为的文件中的一行link.j并在它之后运行一个程序,当程序完成后,我想再次运行它,但是对link.j文件进行不同的替换,就像在循环中对我指定的所有值一样。

所以为了替换我所做的一行

sed -i '' -e '3 s/0.5/0.1/' link.j

然后运行

copy.sh

所以我将第三行的值替换为0.5to 0.1。现在我想继续这样做,但是对于从0.11.0间隔的值0.1,所以0.1,0.2...1.0,并且总是在之后运行代码。

我运行的代码将我刚刚修改的文件复制到一个新的子文件夹中,因此我想在再次运行替换之前保存这些文件夹。

copy.sh 脚本如下所示

for dir in `ls -d ../files/files-12/??`
do

id=`echo $dir | awk -F/ '{print $4}'`
mkdir $id

cp ../stack/*/${id}/rf* .
done

标签: shellvim

解决方案


您可以像这样遍历可能的替换字符串:

for n in 0.{1..9} 1.0; do
    sed -i '' -e "3 s/0\.5/$n/" link.j
    ./copy.sh
done

请注意,我已经逃脱了0.5; 否则,它将匹配任何字符。

大括号扩展是一种 Bashism;如果你不使用 Bash,你可能有seq(也是非 POSIX):

for n in $(seq 0.1 0.1 1.0); do

对于 POSIX 合规性,您可以使用 awk:

for n in $(awk 'BEGIN { for (i = 0.1; i <= 1.0; i += 0.1) print i }'); do

推荐阅读