如何使用sed替换与列表匹配

时间:2018-10-23 06:02:02

标签: linux sed

我想使用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

有更好的主意吗?

2 个答案:

答案 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