使用 sed 编辑带有变量的文件中的行

使用 sed 编辑带有变量的文件中的行

我需要使用 编辑文件中的行sed。现在的问题是我正在用文本和数字的组合替换特定的模式。这个数字是一个变量,它在每个后续行中不断增加。现在,当sed一次性执行所有行的命令时,它将用文本和固定数字(即数字的初始值)替换找到的模式。

例如:

k = 10
sed "s/raj/ram${k++}/"

答案1

如果您的文件非常小,这可能会起作用:

#!/bin/bash
for n in {1..40}
do
    sed -i $n's/raj/ram'$n'/' file
done 

它会迭代该文件 40 次,并且始终只替换 1 行。如果您想不按行号增加计数器,而是按更改的行数增加计数器,则必须使用 2 个变量以不同的方式执行此操作,但 sed 命令将类似 - n 不会由循环设置。

sed -i 就地更改文件,因此如果您想保留原始文件,则必须先制作一个副本。

如果您愿意,可以在 oneliner 中完成:

for n in {1..40}; do sed -i $n's/raj/ram '$n'/' file ; done

也可以选择正确的尺寸而不是自动选择 40。

答案2

awk -v n=10 '{sub(/raj/, "ram" n); print; n++}'

答案3

有的时候要用sed,有的时候不用。
因为sed没有内置算术,就用别的东西吧。
你可以破解 sed 来做到这一点(没有 for 循环),但与使用更适合的东西相比,这是毫无意义的,而且只是一个混乱的组装。

使用此输入数据:

printf '%s\n' 'a.raj' 'yyy' 'zzz' 'b.raj c.raj' >file
num=10 # start with this value

这是一个 perl 方法,它递增每一个出现raj(每个匹配行不仅仅出现一次)

perl -pe 'BEGIN{ $num='$((num-1))' }
          s/raj/ram.($num+=1)/ge' file

输出:

a.ram10
yyy
zzz
b.ram11 c.ram12

这是另一个珀尔版本,递增raj版本,仅每个匹配行一次(即同一行上的多个匹配项具有相同的数字后缀)。

perl -pe 'BEGIN{ $num='$num' }
          if(/raj/){ s/raj/ram.$num/ge; $num+=1 }' file

输出:

a.ram10  
yyy  
zzz  
b.ram11 c.ram11  

看:我什么时候不应该使用 sed

相关内容