我需要使用 编辑文件中的行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