我想使用sed替换文本文件,但要使用序列。
example.txt:
1. 2000000
2. 2000000
3. 2000000
4. 2000000
我想要一个类似的结果:
1. 2000000
2. 1900000
3. 1800000
4. 1700000
我有这种肮脏的方式:
for i in {2000000..1700000..-100000}; do sed -i -e "0,/2000000/! {0,/2000000/ s/2000000/$i/}" example.txt; done
有更好的主意吗?
答案 0 :(得分:1)
使用awk可能会更容易:
awk '{sub("2000000",2000000-(100000*c++))}1' file
未为第一行定义计数器c
,因此数字不会更改。在下一行,计数器增加,而值减小。
答案 1 :(得分:1)
如果要将第二个字段替换为与第一行的值相减10,000的数字,请尝试
awk 'NR == 1 { value = $2 }
NR > 1 { value -= 10000; $2 = value }
1' file >newfile
Awk的某些变体具有--inplace
选项或类似选项,使您可以将结果直接写回输入文件。
将其重构为sed
脚本是毫无意义且具有推测性的,但是如果您知道文件中期望多少行的上限,则可以生成一个sed
脚本,如
2s/[1-9][0-9]*$/1900000/
3s/[1-9][0-9]*$/1800000/
4s/[1-9][0-9]*$/1700000/
:
输入尽可能多的行,然后以该脚本作为输入运行一次sed
。如果您使用的是Linux,则应该能够将脚本传递到sed
的标准输入中:
for ((i=1900000, j=2; i>0; i-= 10000, j++)); do
printf '%is/[1-9][0-9]*$/%i\n' "$j" "$i"
done |
sed -i -f - example.txt