更改查找并替换每次迭代

时间:2012-03-05 15:06:00

标签: bash unix sed iteration replace

我有以下问题。

我有3个目录,每个目录中都有一个文件A.txt

A.txt内我想用XXX替换值。但是,每个目录的值都不同。

这是一个使用sed的简单示例。

cd 1

sed 's/XXX/123/g' A.txt > B.txt

cd ..

cd 2 

sed 's/XXX/456/g' A.txt > B.txt

cd ..

cd 2 

sed 's/XXX/789/g' A.txt > B.txt

cd ..

我有大约10,000个替代品,所以效率非常低。

不幸的是,替换值123,465等不是增量的,因此必须从文件中读取。

in.txt包含123 456 789

有没有办法可以创建一个循环,通过引用文件行/列或其他东西来改变每次迭代要替换的值?

非常感谢任何建议

DP

我几乎用它来管理它。

for dir in 1 2 3

do

while read I

do

cd $dir

sed -n 's/XXX/'"$I"'/p' A.txt > B.txt

cd ..

done

done < in.txt

但循环不正确所以它总是导致B.txt中的in.txt的最终值

有什么建议吗?

由于

1 个答案:

答案 0 :(得分:1)

sed将文件名作为脚本:

sed -f sed.script

某些版本的sed(特别是(较旧的?)HP-UX)对sed脚本中显示的行数有限制 - 限制大约为100。大多数版本的sed没有公开限制,但10,000次替换可能会遇到限制。

您应该考虑生成一组脚本,dir1.seddir2.seddir3.sed

然后你可以写:

for dir in 1 2 3
do
    (
    cd $dir &&
    sed -f ../dir$dir.sed A.txt > B.txt
    )
done

请注意,如果您需要进行多次传递(因为您必须创建dir1.1.seddir1.2.sed,... dir1.N.sed),那么您需要安排编辑B.txt第二遍等等。

请注意使用(...)子shell将驱动脚本与cd操作隔离开来。那时就不需要cd ..。我对包含...; cd somedir; ...; cd ..的任何脚本都持怀疑态度。

某些版本的sed(受GNU启发)支持就地文件修改:sed -i -f dir1.sed A.txt。否则,如果您需要保留A.txt,请先复制,然后重复编辑副本:

for dir in 1 2 3
do
    (cd $dir; cp A.txt B.txt)
done

for dir in 1 2 3
do
    for script in 1 2 3 4 ... N
    do
        (
        cd $dir
        sed -f ../dir$dir.$script.sed B.txt > C.txt
        mv C.txt B.txt
        )
    done
done

sed脚本文件的内容如下所示:

s/XXX/123/
s/YYY/234/
s/zzz/abc/

等 - 它们是sed命令。