将非常接近的单词替换为另一个单词

时间:2016-09-21 06:48:55

标签: linux bash shell sed grep

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

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.it应如下

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

这可能适合你(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

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