【问题标题】:Replace very near word to a number with another word [closed]用另一个词替换非常接近的词到一个数字[关闭]
【发布时间】:2016-09-21 06:48:54
【问题描述】:

将非常接近的字符串替换为另一个字符串的数字

a b c d a b c d e 23:12:00 k b c l d b d c e 12:02:10

如何将时间(数字)之前的第一个d替换为另一个字符f.应该如下

a b c d a b c f e 23:12:00 k b c l d b f c e 12:02:10

或,

如何用标题替换单元格。

[srinivas@examplewww ~]$ grep -oP '(cell">)[0-2][0-9]+:[0-9]+:[0-9]+'  test.html1
cell">06:25:50
cell">23:59:38
cell">23:17:50
cell">06:27:37
cell">06:07:38

应该是这样的

   header ">06:25:50
   header ">23:59:38
   header ">23:17:50
   header ">06:27:37
   header ">06:07:38

【问题讨论】:

  • 另外,规则是什么? sed 's/d/f/2' 满足您的要求,但可能不适用于一般情况。
  • OR分隔的两个问题陈述完全不同。
  • 两者都是不同的。如果第一个是不可能的,那么将使用第二个
  • 2 个问题陈述 = 关于 SO 的 2 个单独问题。
  • 第一个问题:perl -nE '$_ = reverse; s/(?<=[0-9])(.*?)d/\1f/g; $_=reverse; print' input.txt 我假设df 是占位符,在实际用例中不必是单个字符串。

标签: linux bash shell sed grep


【解决方案1】:

以下解决方案将搜索任何数字,如果找到,它将开始向后轮询以在字符串中搜索 d,如果找到,则将其替换为 b

示例输入:

echo $x
a b c d a b c d e 23:12:00 k b c l d b d c e 12:02:10

使用 awk 的解决方案:

echo $x |awk '{for(i=1;i<=NF;i++) if($i ~/[0-9]|-[0-9]/) for(j=i;j>=0;j--) if($j ~/d/) {gsub(/d/,"b",$j);break }}1'
a b c d a b c b e 23:12:00 k b c l d b b c e 12:02:10

【讨论】:

  • 谢谢。在所有情况下都能完美运行。如果我想在 20:00:00 以下更改。结果应该是 a b c d a b c d e 23:12:00 k b c l d b b c e 12:02:10
  • 即使在 -ve 中,如 -39:00:00 ,也应该改变
  • @SrinivasNallapati ,现在尝试使用负数。对命令做了一些小的改动。
  • 太棒了.它工作正常..我正在使用if($i ~/&gt;[0-1][0-9]:..:..|&gt;-[0-9][0-9]:..:../)
  • 很高兴,您的问题解决了。
【解决方案2】:

这可能对你有用(GNU sed):

sed -r 's/d([^d:]*([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9])/f\1/g' file

sed -r 's/cell(">([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9])/   header \1/' file

两个正则表达式模式匹配,然后在替换的替换端使用反向引用。

【讨论】:

  • 感谢 Potong。它工作正常。如果我想更改少于 24:00:00 的行,那么我该如何给出限制
  • @SrinivasNallapati 查看编辑
  • 感谢您的回复。通过这个我们不能改变 19:00:00。通过你的命令我们可以改变 01,02,03 但不能改变 04。请建议
  • @SrinivasNallapati 查看编辑
猜你喜欢
  • 2014-08-12
  • 1970-01-01
  • 2012-02-26
  • 1970-01-01
  • 2019-09-24
  • 1970-01-01
  • 1970-01-01
  • 2021-07-22
  • 1970-01-01
相关资源
最近更新 更多