用sed替换另一个词-问题

时间:2018-12-28 16:37:07

标签: bash sed redhat

在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

2 个答案:

答案 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”扩展名。