我试图通过添加一个数字来替换我的文本文件中的数字。即。
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
有关上述工作的任何提示吗?
答案 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。
我宁愿使用perl
(something 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。这种方法充满了问题,可能会导致意想不到的结果。