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
您好,我有一个文件,其中包含以下几行(下面是单个示例行)
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