使用sed替换列字段分隔符

时间:2018-03-11 17:03:59

标签: regex bash awk sed

我有一个文本文件1.txt:

cam:45c62741b9c99e1dcf3c140e8e3df635::dv:johnybold@yahoo.com:83.228.32.24
gamer:3dabd5bd7984b0286eba52d4a7db2dea:$Wm?1Z3MPErXl7%yk^Pc#%iu\9LFc{:octopus@vida.tv:93.182.154.63
:adc0a54f8d21694848200ae043fa99f2:GqJ:LOLPELIC@trash-mail.com:84.176.127.30
! Aa:da99417e29ab0aa67f97db64f091836b:k_P:prus_da@yahoo.com:82.179.236.154

我想将列分隔符(目前为':')更改为' || o ||'。 我想只更改第1,第3和第4列分隔符,因为第2列包含hash:salt

之类的内容

我正在尝试的脚本是:

sed 's/:/||o||/1;s/:/||o||/2;s/:/||o||/2' 1.txt

唯一的问题是在结果中':'包含在盐中。 我得到的输出是:

cam||o||45c62741b9c99e1dcf3c140e8e3df635:||o||dv||o||johnybold@yahoo.com:83.228.32.24
gamer||o||3dabd5bd7984b0286eba52d4a7db2dea:$Wm?1Z3MPErXl7%yk^Pc#%iu\9LFc{||o||octopus@vida.tv||o||93.182.154.63
||o||adc0a54f8d21694848200ae043fa99f2:GqJ||o||LOLPELIC@trash-mail.com||o||84.176.127.30
! Aa||o||da99417e29ab0aa67f97db64f091836b:k_P||o||prus_da@yahoo.com||o||82.179.236.154

输出的第一行是错误的。

Expected output :
cam||o||45c62741b9c99e1dcf3c140e8e3df635::dv||o||johnybold@yahoo.com||o||83.228.32.24

其余输出是正确的。

我期待的是先取代':'从前进,第二次和第三次更换应该从后面进行,以便':'在盐中被忽略了。

2 个答案:

答案 0 :(得分:2)

试试这个:

(?:^[^:]*\K:)|(:(?=[^:]+:?[^:]+$))

基本理念:

  • 获取行
  • 中出现的第一个:
  • :后面跟着最多一个:

演示:regex101

替换演示:regex101

如何使用perl

运行它
perl -p -e 's/(?:^[^:]*\K:)|(:(?=[^:]+:?[^:]+$))/||o||/g' input.txt

答案 1 :(得分:1)

sed 解决方案:

sed -E 's/:+/||o||/3g; s/:/||o||/' file

输出:

cam||o||45c62741b9c99e1dcf3c140e8e3df635::dv||o||johnybold@yahoo.com||o||83.228.32.24
gamer||o||3dabd5bd7984b0286eba52d4a7db2dea:$Wm?1Z3MPErXl7%yk^Pc#%iu\9LFc{||o||octopus@vida.tv||o||93.182.154.63
||o||adc0a54f8d21694848200ae043fa99f2:GqJ||o||LOLPELIC@trash-mail.com||o||84.176.127.30
! Aa||o||da99417e29ab0aa67f97db64f091836b:k_P||o||prus_da@yahoo.com||o||82.179.236.154