2

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

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

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

4

5 回答 5

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标志它已经在字符串中的任何位置将每个数字序列都增加了一个。

于 2012-05-28T08:53:59.053 回答
2

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

sed y/12345678/23456789/ path.txt

并且更好地实现为

tr 12345678 23456789 < path.txt

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

于 2012-05-28T09:59:19.230 回答
1

您可以做到,sed但这并不容易,请参阅此线程

awk 也很难,请看这个

我宁愿使用perl这个(在@ideone的行动中可以看到类似的东西):

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

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

于 2012-05-28T09:06:08.143 回答
0

这可能对您有用(GNU sed 和 Bash):

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

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

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

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

于 2012-05-28T10:52:40.597 回答
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
于 2012-05-28T08:49:38.467 回答