查找模式并修改下一行,而不修改文件中的其他内容。最好是基于linux的命令(sed,awk等)

时间:2014-08-15 16:57:20

标签: linux bash shell awk sed

我有一个看起来像这样的文件:

# Hello, welcome to the world
# Trying to modify XXXXXX
# Some more random text

poly RANDOM LAYER{
    20 25
    18 2
    1 5
    1 2
    5 6
    }


poly RANDOM LAYER{
    30 50
    14 25
    15 25
    15 26
    15 26
    15 27
    }

我想增加poly RANDOM图层的下一行中的值,比如将10加到第一个数字(20 + 10 = 30),将20加到下一个数字(25 + 20 = 45)。其余内容应该是相同的: 应该在poly RANDOM LAYER

之后立即对所有行进行此操作

输出应如下所示:

# Hello, welcome to the world
# Trying to modify XXXXXX
# Some more random text

poly RANDOM LAYER{
    *30 45*
    18 2
    1 5
    1 2
    5 6
    }


poly RANDOM LAYER{
    *40 60*
    14 25
    15 25
    15 26
    15 26
    15 27
    }

2 个答案:

答案 0 :(得分:3)

如果特定的前导空格总是4个字符:

$ awk 'f{$1="    "$1+10; $2+=20; f=0} /RANDOM/{f=1} 1' file
# Hello, welcome to the world
# Trying to modify XXXXXX
# Some more random text

poly RANDOM LAYER{
    30 45
    18 2
    1 5
    1 2
    5 6
    }


poly RANDOM LAYER{
    40 70
    14 25
    15 25
    15 26
    15 26
    15 27
    }

否则使用:

$ awk 'f{fmt=$0; gsub(/[^[:space:]]+/,"%s",fmt); $0=sprintf(fmt,$1+10,$2+20); f=0} /RANDOM/{f=1} 1' file

因为它只会在您的输出中重现WHATEVER输入中的前导,尾随或场间空白。

答案 1 :(得分:1)

你说(sed,awk等)。 perl 的一部分吗?

perl -pe 's/(\d+)/$1+10/ge if($lastLineMatch); $lastLineMatch = m/poly RANDOM/; ' < file

或者,如果您想为这两个数字添加不同的值:

perl -pe 's/(\d+)(\D+)(\d+)/($1+10).$2.($3+20)/ge if($lastLineMatch); $lastLineMatch = m/poly RANDOM/; ' < file