带有变量的sed正则表达式替换文件中的数字

时间:2012-05-28 08:24:10

标签: linux perl sed

我试图通过添加一个数字来替换我的文本文件中的数字。即。

sed 's/3/4/g' path.txt
sed 's/2/3/g' path.txt
sed 's/1/2/g' path.txt

而不是这个,我可以自动化它,即找到一个/ d并在替换中添加一个。

这样的东西
sed 's/\([0-8]\)/\1+1/g' path.txt

还希望捕获多个数字,即([0-9])\t([0-9])并更改每个数字,使标签位于中间

由于

编辑#2 使用perl示例, 我也希望它可以使用更多数字,即

perl -pi~ -e 's/(\d+)\.(\d+)\.(\d+)\.(\d+)/ ($1+1)\.($2+1)\.($3+1)\.($4+1) /ge' output.txt

有关上述工作的任何提示吗?

5 个答案:

答案 0 :(得分:6)

sed中不支持算术,但您可以在Perl中轻松完成此操作。

perl -pe 's/(\d+)/ $1+1 /ge'

使用/e选项,替换表达式需要是有效的Perl代码。因此,要处理最终更新的示例,您需要

perl -pi~ -e 's/(\d+)\.(\d+)\.(\d+)\.(\d+)/ $1+1 . "." $2+1 . "." . $3+1 . "." . $4+1 /ge'

其中字符串被正确引用,并且相邻字符串与. Perl字符串连接运算符连接在一起。 (当它们与字符串连接时,算术数字也被强制转换为字符串。)

...当然,第一个脚本已经更优雅了,因为使用/g标志它已经在字符串中的任何位置增加了每个数字序列。

答案 1 :(得分:2)

Triplee的perl解决方案是更通用的解决方案,但Michal的sed解决方案适用于这种特殊情况。但是,Michal的sed解决方案更容易编写:

sed y/12345678/23456789/ path.txt

并且更好地实现为

tr 12345678 23456789 < path.txt

这完全无法处理2位数字(如编辑的问题所示)。

答案 2 :(得分:1)

您可以使用sed执行此操作,但这并不容易,请参阅this thread

而且awk也很难,see this

我宁愿使用perlsomething like this can be seen in action @ ideone):

perl -pe 's/([0-8])/$1+1/e'

(ideone.com示例必须有一些循环,因为ideone默认情况下不会设置-pe。)

答案 3 :(得分:0)

你不能直接在sed中添加 - 你可以在awk中通过在每行中使用正则表达式匹配数字并增加值来实现,但这很复杂。如果不需要处理任意数字但只需要有限的集合,例如只有0到8之间的单位数字,您可以通过用分号分隔它们,在单个sed命令行上放置几个替换命令:

sed 's/8/9/g ; s/7/8/g; s/6/7/g; s/5/6/g; s/4/5/g; s/3/4/g; s/2/3/g; s/1/2/g; s/0/1/g' path.txt

答案 4 :(得分:0)

这可能适合你(GNU sed&amp; Bash):

sed 's/[0-9]/$((&+1))/g;s/.*/echo "&"/e' file

这将为每个数字添加一个数字,以增加数字:

sed 's/[0-9]\+/$((&+1))/g;s/.*/echo "&"/e' file

N.B。这种方法充满了问题,可能会导致意想不到的结果。