我有一个文本文件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
其余输出是正确的。
我期待的是先取代':'从前进,第二次和第三次更换应该从后面进行,以便':'在盐中被忽略了。
答案 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