在redhat服务器上,
我有多个名为PO*******
的文件
在他们里面,我有这样一条线:
NODE PO******* TCPblahblah blah
另一方面,我有一个csv文件,其中包含多行,如:
PO*******,XXXXXXX
我要替换文件PO*******
NODE PO******* TCPblahblah blah
通过
NODE XXXXXX TCPblahblah blah
请参阅我的代码以了解如何使此输出与NODE一致: TCPblahblXXX
for i in $(ls def)
do
new= $(grep $i list.csv | cut -d ',' -f2)
sed "/NODE/ s/$i/$new/g" def/$i
done
答案 0 :(得分:2)
当每个def/*
文件只有一行/NODE/
时,您可以尝试嵌套的sed
。
请记住,当您不希望使用sed
时,,
可以使用其他字符,例如#
或/
。
# First look at the generated commands by
sed 's#.*#/NODE/ s,&,#' list.csv
# next try
sed -f <(sed 's#.*#/NODE/ s,&,#' list.csv) def/*
# Make backup before changing
cp -r def def_bak
# Get serious
sed -if <(sed 's#.*#/NODE/ s,&,#' list.csv) def/*
如果不确定(重叠的文件,如PO1和PO12),则可以从csv开始遍历这些文件。
while IFS= read -f line; do
test -f def/"${line%,*}" || continue
sed -i "s,${line}," def/"${line%,*}"
done < list.csv
答案 1 :(得分:0)
你等等太多了,缺少可测试的输入文件,但是我认为这样做会
$ awk 'NR==FNR{a[$1]=$2; next} {f=FILENAME; sub(f,a[f]); print > f".mod"}' list.csv def/*
这将为处理的文件创建“ .mod”扩展名。