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

awk matching regex and replace the symbol

您好,我有一个文件,其中包含以下几行(下面是单个示例行)

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(~/\/.+?(?=utt)/){sub(/\//,"|",[=14=])}} {print [=14=]}'

如有任何帮助,我们将不胜感激。

尝试

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

这将匹配一个 / 后跟以 .utt 结尾的非 / 字符(除了第一个 /,其余的被捕获在一个组中 backreferenced 在替换部分)

请注意,这并没有特别限制匹配到第 3 个字段

以下 awk 也可能对您有所帮助(考虑到您的 Input_file 与所示示例相同):

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

现在也添加 non-one 线性形式的解决方案:

awk '
{
   if(match([=11=],/\/003_nt2bnet_Acq004601_0100_0420_mc.utt/)){
     print substr([=11=],1,RSTART-1) "|" substr([=11=],RSTART+1,1) substr([=11=],RSTART+2);
     next}
}
1
'   Input_file

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

使用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 '{[=11=]=gensub(/(.*)\//,"\1|",[=11=])}1' file