найти и заменить несколько строк строки с помощью sed

У меня есть входной файл, содержащий следующие числа

-45.0005
-43.0022
-41.002
.
.
.

У меня есть целевой txt файл

line:12 Angle=30
line:42 Angle=60
line:72 Angle=90
.
.
.

Используя sed, я хочу заменить первый экземпляр записи Angle в целевом файле первой записью из входного файла, вторую запись Angle второй записью входного файла и так далее...

Ожидаемый результат:

line:12 Angle=-45.005
line:42 Angle=-43.002
line:72 Angle=-41.002
.
.
.

Это то, что мне удалось написать, но я не получаю ожидаемого результата


a=`head -1 temp.txt`
#echo $a
sed  -i "12s/Angle = .*/Angle = $a/g" $procfile
for i in {2..41..1}; do
        for j in {42..1212..30}; do
                c=$(( $i - 1 ))
                #echo "this is the value of c: $c"
                b=`head -$i temp.txt | tail -$c`
                #echo "This is the value of b: $b"
                sed  -i "$js/Angle = .*/Angle = $b/g" $procfile 2> /dev/null
        done
done

Не могли бы вы помочь мне улучшить сценарий?

Спасибо!

5 ответов

Решение

Вы можете создать итератор i а затем использовать его в sed выполнить замену в каждой строке.

i=0; 
while read -r line; do 
   i=$((i+1)); 
   sed -i "${i}s/Angle=.*/Angle=${line}/g" $procfile; 
done < temp.txt

Так что я думаю, ты хочешь pastefiles - разметить файлы построчно. Затем замените поле, например, регулярным выражением.

paste target_file input_file | sed 's/\(Angle=\)[^\t]*\t/\1/'

Pr может помочь здесь, попробуйте следующее:

pr -m -t target input | sed -r 's/(Angle=)[^\s]+\s+/\1/'

Обратите внимание - это работает для ваших первых двух показанных файлов, ваш код предполагает другой ввод - например, пробелы вокруг "=".

Итак, я смог придумать это решение

#!/bin/bash

infile=$1
cp $infile ORIG_${infile}
grep "Angle = " $infile | sed 's/Angle = //g' | sort -n > temp.txt

iMax=`cat temp.txt | wc -l`
jMax=`grep -n "Angle = " $infile | tail -1 | sed 's/:.*//g'`

for ((i=1,j=12; i<=${iMax} && j<=${jMax};i+=1,j+=30));do
        a=`head -$i temp.txt | tail -1`
        sed -i "${j}s/Angle = .*/Angle = $a/g" $infile
done
rm temp.txt

Большое спасибо William Pursell за разъяснение синтаксиса увеличения числа William Pursell в bash.

Это может сработать для вас (GNU sed):

sed '/Angle=/R inputFile' targetFile | sed '/Angle=/{N;s/=.*\n/=/}'

В первом вызове sed добавьте строку ввода.

Во втором вызове sed удалите оригинал angle и разделитель новой строки.

Другие вопросы по тегам