繁体   English   中英

使用sed替换列字段分隔符

[英]replacing column field separator using 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 ||'。 我只想更改第一,第三和第四列分隔符,因为第二列包含类似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

其余的输出是正确的。

我期望的是从正向替换第一':',第二次从后向替换,因此盐中的':'被忽略。

尝试这个:

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

基本思路:

  • 要么得到第一个:发生在行中
  • :接着最多是另一个:

演示: regex101

带替换的演示: regex101

如何使用perl运行它:

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

简短的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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM