awk匹配正则表达式并替换符号。

3

您好,我有一个文件,其行的格式如下(以下是单个样本行)

Running Test File: 
/home/rsc_app|06_2BIN/08_payfacil/01_5BIN/003_nt2bnet_Acq004601_0100_0420_mc.utt|Test
Result | Pass | MIG_NT2_EP2 CIS_EP1|0403319|

我将尝试实现的目标是匹配。
/003_nt2bnet_Acq004601_0100_0420_mc.utt

并将 / 更改为 |,以便结果变为(.UTT之前的文本可以是任何内容,基本上它是一个文件名,而 .utt 是扩展名,因此我想找到匹配 .utt 的模式并替换 / 为 |)

|003_nt2bnet_Acq004601_0100_0420_mc.utt

整行代码应为:
Running Test File:
/home/rsc_app|06_2BIN/08_payfacil/01_5BIN|003_nt2bnet_Acq004601_0100_0420_mc.utt|Test
Result | Pass | MIG_NT2_EP2 CIS_EP1|0403319|

我已经尝试了许多正则表达式来匹配,但是都没有成功。我最后尝试的一个如下所示:

awk -F["|"] '{if($3~/\/.+?(?=utt)/){sub(/\//,"|",$0)}} {print $0}'

任何帮助都将不胜感激。

1
请注意,awk不支持环视。请参见:https://unix.stackexchange.com/questions/119905/why-does-my-regular-expression-work-in-x-but-not-in-y - Sundeep
3个回答

4

尝试

sed 's#/\([^/]*\.utt\)#|\1#'

这将匹配以/开头,后跟非/字符并以.utt结尾的内容(除了第一个/外,其余内容会被捕获在一个组中,在替换部分中可通过反向引用)。
请注意,这并没有特别限制匹配到第三个字段。

1

以下的 awk 命令也可以帮助您完成相同的任务(假设您的输入文件与示例中所示相同):

awk 'match($0,/\/003_nt2bnet_Acq004601_0100_0420_mc.utt/){print substr($0,1,RSTART-1) "|" substr($0,RSTART+1,1) substr($0,RSTART+2);next} 1'  Input_file

将非一行解决方案添加到代码中:
awk '
{
   if(match($0,/\/003_nt2bnet_Acq004601_0100_0420_mc.utt/)){
     print substr($0,1,RSTART-1) "|" substr($0,RSTART+1,1) substr($0,RSTART+2);
     next}
}
1
'   Input_file

或者

awk '
match($0,/\/003_nt2bnet_Acq004601_0100_0420_mc.utt/){
     print substr($0,1,RSTART-1) "|" substr($0,RSTART+1,1) substr($0,RSTART+2);
     next}
1
'  Input_file

@JamesBrown,非常抱歉,您能否解释一下哪里出了问题,我会编辑代码的,我没有理解。我看到输出结果与您的输出结果相同(如果我漏掉了什么,请谅解)。 - RavinderSingh13
1
@JamesBrown,太酷了。非常感谢你让我知道,现在已经修复了,你真是太棒了 :) - RavinderSingh13
1
@JamesBrown,II标题,完成了先生,谢谢您一直的指导 :) - RavinderSingh13

1
使用 rev 命令反转文本,并用 | 替换第一个 /。使用 awk:
$ rev file | 
  awk '{sub(/\//,"|")}1' | 
  rev
/home/rsc_app|06_2BIN/08_payfacil/01_5BIN|003_nt2bnet_Acq004601_0100_0420_mc.utt|Test
Result | Pass | MIG_NT2_EP2 CIS_EP1|0403319|

这会对每个记录进行更改,因此如果其他记录中有“/”,请使用某些排除规则。 编辑:根据Sundeep的评论,使用GNU awk的gensub和贪婪模式:
$ awk '{$0=gensub(/(.*)\//,"\\1|",$0)}1' file

1
将最后出现的某个字符串替换也可以使用正则表达式,利用贪婪模式... echo 'a/b/c/d/e' | sed 's#\(.*\)/#\1|#' - Sundeep

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接