我有以下问题。
我有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的最终值
有什么建议吗?
由于
答案 0 :(得分:1)
sed
将文件名作为脚本:
sed -f sed.script
某些版本的sed
(特别是(较旧的?)HP-UX)对sed
脚本中显示的行数有限制 - 限制大约为100。大多数版本的sed
没有公开限制,但10,000次替换可能会遇到限制。
您应该考虑生成一组脚本,dir1.sed
,dir2.sed
和dir3.sed
。
然后你可以写:
for dir in 1 2 3
do
(
cd $dir &&
sed -f ../dir$dir.sed A.txt > B.txt
)
done
请注意,如果您需要进行多次传递(因为您必须创建dir1.1.sed
,dir1.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
命令。