在 sed 中操作 & 符号

发布于 2024-11-25 17:32:38 字数 257 浏览 1 评论 0原文

是否可以在 sed 中操作 & 符号?我想为文件中的所有数字添加 +1。像这样的东西:

sed -i "s/[0-9]\{1,2\}/$(expr & + 1)/g" filename

编辑:今天我使用 grep 和 sed 创建了一个循环来完成所需的工作。但如果有人知道操作&符号的方法,问题仍然悬而未决,因为这不是我第一次想在替换字符串上运行命令,而且不能

Is it possible to manipulate the ampersand in sed? I want to add +1 to all numbers in a file. Something like this:

sed -i "s/[0-9]\{1,2\}/$(expr & + 1)/g" filename

EDIT: Today I created a loop using grep and sed that does the job needed. But the question remains open if anyone knows of a way of manipulating the ampersand, since this is not the first time I wanted to run commands on the replacement string, and couldn't.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

或十年 2024-12-02 17:32:38

您可以使用 e 修饰符来实现此目的:

$ cat test.txt
1
2
$ sed 's/^[0-9]\{1,2\}$/expr & + 1/e' test.txt
2
3

在这种情况下,您应该在替换部分构造命令,该命令将被执行,结果将用于替换。

You may use e modifier to achieve this:

$ cat test.txt
1
2
$ sed 's/^[0-9]\{1,2\}$/expr & + 1/e' test.txt
2
3

In this case you should construct command in replacement part which will be executed and result will be used for replacement.

巷子口的你 2024-12-02 17:32:38

sed 需要在每行上调用一些 shell 命令(带有“!”)来执行此操作。

在这里,您认为您正在调用 sed,然后它会回调到 shell 来计算每行的 $(expr & + 1),但实际上并非如此。 $(expr & + 1) 只会由外壳静态求值(一次),并导致错误,因为 '&'此时还不是一个数字。

要实际执行此操作,可以:

  1. 按照 sed 文档中的示例,对最后一位数字 0..9 的所有十种情况进行硬编码

  2. 使用以 '1,$!' 开头的 sed 命令在每一行调用 shell,并执行增量在那里,使用 expr、awk、perl 或其他。

  3. 脚注:我从来不知道 /e 修饰符,php-coder 显示。

sed will need to thunk out to some shell command (with '!') on each line to do that.

Here you think you are calling sed which then calls back to the shell to evaluate $(expr & + 1) for each line, but actually it isn't. $(expr & + 1) will just get statically evaluated (once) by the outer shell, and cause an error, since '&' is not at that point a number.

To actually do this, either:

  1. hardcode all ten cases of last digit 0..9, as per this example in sed documentation

  2. Use a sed-command which starts with '1,$!' to invoke the shell on each line, and perform the increment there, with expr, awk, perl or whatever.

  3. FOOTNOTE: I never knew about the /e modifier, which php-coder shows.

世界等同你 2024-12-02 17:32:38

很好的问题。 smci 首先回答并且对 shell 非常了解。

如果您想一般性地解决这个问题,这里(为了好玩)嵌入了一个示例中的 Ruby 解决方案:

echo "hdf 4 fs 88\n5 22 sdf lsd 6" | ruby -e 'ARGF.each {|line| puts line.gsub(/(\d+)/) {|n| n.to_i+1}}'

输出应该是

hdf 5 fs 89\n6 23 sdf lsd 7

Great question. smci answered first and was spot on about shells.

In case you want to solve this problem in general, here is (for fun) a Ruby solution embedded in an example:

echo "hdf 4 fs 88\n5 22 sdf lsd 6" | ruby -e 'ARGF.each {|line| puts line.gsub(/(\d+)/) {|n| n.to_i+1}}'

The output should be

hdf 5 fs 89\n6 23 sdf lsd 7
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文