用正则表达式搜索并增加int

时间:2017-12-28 10:45:45

标签: regex bash sed increment

我有几个文件(相同的文件名)和这个文本

die($query);

如何从cmd中增加所有版本号?

我可以轻松version: 24 runtime: python27 命令,但我正在寻找智能增量,而不只是替换文字

sed

4 个答案:

答案 0 :(得分:5)

使用awk:

awk '/^version:/ {$2++}1' file

或更短:

Company Type Status
A       X    done
A       Y    done
A       Z    done
C       X    done
C       Y    done
B       Y    done

输出继电器:

version: 25
runtime: python27

答案 1 :(得分:2)

sed不适合算术运算,您可以在这里使用perl

$ perl -pe 's/\d+/$&+1/e if /version/' ip.txt 
version: 25
runtime: python27
  • s/\d+/$&+1/e e修饰符允许在替换部分中使用Perl代码。 $&包含匹配的字符串(类似于sed中的&),$&+1是您需要的结果
    • if /version/此替换仅在输入行包含version
    • 时才会发生

对于就地编辑,请使用perl -i -pe 's/\d+/$&+1/e if /version/' /path/to/files

请参阅 关于-i-pe选项

的解释,请https://perldoc.perl.org/perlrun.html#Command-Switches

答案 2 :(得分:1)

肯定会完成这项工作,但坚持下去并不是一个好主意。一个小小的捣蛋技巧会更好。

VER=$(grep 'version' filename | grep -oE '[0-9]+')
sed -i "/version/s/$VER/$((VER+1))/" filename

这真的是一个技巧,因为sed不能进行算术运算,因此我将该作业重载为bash并使用sed仅进行文本替换。

为方便起见,您可能想要将它们包装起来:

incr_ver() {
  VER=$(grep 'version' "$1" | grep -oE '[0-9]+')
  (( $? )) || sed -i "/version/s/$VER/$((VER+1))/" "$1"
}

并将它们应用于每个文件:

for file in *
do
  incr_ver "$file"
done

答案 3 :(得分:1)

使用gnu sed

dd('test');