Замена слова другим словом sed - проблема - PullRequest
0 голосов
/ 28 декабря 2018

На сервере Redhat,

У меня есть несколько файлов с именем PO******* Внутри них у меня есть такая строка:

NODE PO******* TCPblahblah blah

С другой стороны, у меня есть CSV-файл, содержащийнесколько строк, например:

PO*******,XXXXXXX

я хочу заменить в файлах PO*******
NODE PO******* TCPblahblah blah
на NODE XXXXXX TCPblahblah blah

См. мой код, что я сделал симеть этот вывод на линии с узлом: 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 голосов
/ 29 декабря 2018

Когда каждый 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
0 голосов
/ 28 декабря 2018

у вас слишком много бла-бла и не хватает тестируемых входных файлов, но я думаю, что это сделает

$ awk 'NR==FNR{a[$1]=$2; next} {f=FILENAME; sub(f,a[f]); print > f".mod"}' list.csv def/*

, это создаст расширения ".mod" для обработанных файлов.

...