【问题标题】:Sed replace character after every numbersed 在每个数字后替换字符
【发布时间】:2015-08-14 21:10:43
【问题描述】:

我想用 sed 替换每个整数后的一个字符。

例子:

444 d 应该去: 444,d

编辑:stribizhev 的回答帮助我找到了 sed (GNU sed) 4.2.2 的解决方案

sed -r 's/([0-9]+)./\1,/g'

用逗号替换数字后的任意字符。唯一的问题是,行尾的数字也会产生一个额外的逗号。

【问题讨论】:

  • sed -i 's/ /,/g' $strign
  • 请向我们展示您迄今为止的工作。你试过什么?很高兴帮助您调试代码。
  • 匹配你想要的文本总是微不足道的,不匹配你不想要的文本要困难得多,所以编辑你的问题以提供示例输入和预期输出,包括你认为很难的情况避免错误匹配(例如数字-空格-数字,或换行-空格-字母或...)。正如所写,您只需要tr ' ' ','。另外-对您来说什么是数字? 1,000? 3.14? 5e7? -3?
  • 我打算只搜索整数。对不起。请查看编辑。

标签: regex sed


【解决方案1】:

您可以使用捕获组来做到这一点:

sed 's/\(\d\+\)./\1,/g'

或(由于使用 GNU sed,您可以通过使用扩展正则表达式来避免所有转义括号)

sed -r 's/([0-9]+)./\1,/g'

这是demo showing what the regex does

[0-9]+ 模式匹配一​​个整数(不带小数),即使在更长的字符串中,甚至在更长的单词中。

【讨论】:

  • 忘记添加:. 匹配除换行符以外的任何符号。因此,我们将用您在替换部分中指定的任何字符替换字面上的 any 字符。
  • 应该注意这两种解决方案都适用于 GNU sed,但不适用于其他变体。便携的解决方案要困难得多。 :-)
  • 更难sed 's/\([0-9]\+\)./\1,/g' 应该这样做。我更喜欢使用[:digit:] 而不是0-9,但我怀疑这会限制可移植性。
  • 您能帮忙解释一下 (\d+) 是如何捕获多个单词的吗?它不应该只捕获一个词吗?
  • @user1074593: \d+ 匹配 1 个或多个数字,它不匹配“单词”。您说您需要在 number (这是一个数字序列)之后替换任何字符(与 . 匹配)。如果我的逻辑不符合您的要求,请告诉我。
猜你喜欢
  • 2022-01-23
  • 2021-10-28
  • 2021-09-23
  • 2020-01-12
  • 1970-01-01
  • 2020-03-13
  • 2011-05-17
  • 2014-09-20
  • 1970-01-01
相关资源
最近更新 更多