使用sed查找并替换多行字符串

时间:2020-07-03 12:37:29

标签: bash sed gnu-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 个答案:

答案 0 :(得分:1)

您可以创建一个迭代器i,然后在sed中使用它来在每一行中执行替换。

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

答案 1 :(得分:1)

所以我想您想paste个文件-逐行对文件进行破坏。然后,使用正则表达式替换该字段。

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

答案 2 :(得分:0)

pr在这里可能会有所帮助,请尝试以下操作:

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

请注意-这适用于您显示的前两个文件,您的代码采用了一些不同的输入-例如“ =”周围的空格。

答案 3 :(得分:0)

这可能对您有用(GNU sed):

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

在第一次sed调用中,添加输入行。

在第二次sed调用中,删除原始的angle和换行符。

答案 4 :(得分:0)

所以我能够提出这个解决方案

#!/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阐明了bash中增加var计数的语法。