Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 使用sed替换列字段分隔符_Regex_Bash_Awk_Sed - Fatal编程技术网

Regex 使用sed替换列字段分隔符

Regex 使用sed替换列字段分隔符,regex,bash,awk,sed,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

我有一个文本文件
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
唯一的问题是salt中包含“:”的结果。 我得到的结果是:

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
其余的输出是正确的

我所期望的是从前面替换第一个“:”,第二次和第三次替换应该是从后面,这样salt中的“:”就会被忽略。

试试这个:

(?:^[^:]*\K:)|(:(?=[^:]+:?[^:]+$))
基本思想:

  • 获取行中出现的第一个
  • 或者后面最多跟一个的
演示:

带替换的演示:

如何使用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

为什么第三行缺少第一列,为什么最后一行包含空格和
在第一列中?这是计划吗?数据是这样的。Stack Overflow是一个解决编程和开发问题的网站。这个问题似乎离题了,因为它与编程或开发无关。请参见帮助中心中的。也许或者是一个更好的提问方式。我尝试了sed的/(?:^[^::*\K:)|(:(?=[^::+:?[^:::+$)/| o | | | |/'1.txt,但它不起作用。使用
sed-r的/…
来提供扩展正则表达式。@DavidC.Rankin似乎不支持
\K
。Afair-it也不支持可变长度lookbehind,因此本质上OP在sed中是运气不佳的。Perl有完整的PCRE。@BhawandeepSingla是的,那是因为
sed
不支持
\K
,很遗憾。在这里使用perl是个好主意。很抱歉使用upvote/unupvote。您能否解释一下它是否适用于
hash:salt
-部分中任意数量的垃圾-“:”,或者它是否仅在假设将有一个连续的“:”块的情况下工作?如果
salt
部分包含更多的“:”而不是一开始,它似乎会做一些奇怪的事情。@Andreytukin,这些细微差别应该在你的问题中提到。目前,这种方法适用于您当前的输入。如果某个散列是
asd::sasd:asd:asd23:::3f3f4:345f:::234f:
?这不是我的问题,我只是想升级你的解决方案,因为它更短,可能更高效。但我担心它可能会在提供的测试数据上成功,然后在应用于实际数据时失败。。。但是,是的,这只是一个关于OP的实际数据可能有多坏的疯狂猜测,从这个问题上还不清楚。使用
/3g提供良好提示无论如何。@Andreytukin,我只是错过了这不是OP中的问题。我在混乱中错过了这一点(自动),我得到了以下错误:sed:1:“s/:+/| o | o |/3g;s/:/| o | |/”:多个数字或替换标志中的“g”