2016-02-01 31 views
2

我想用'LK'替换每行最后一个字中的'UN'。如何用另一个字符串替换字符串只在每行的最后一个字上

输入文件:

Y'UN 310R 07MAR DAUNEN UN2  
Y'UN 720R 07MAR DENSUN HK2  
Y'UN 721R 14MAR UNDDEN HK2  
Y'UN1692R 14MAR DEUNAY UN2 

输出需要:

Y'UN 310R 07MAR DAUNEN LK2  
Y'UN 720R 07MAR DENSUN HK2  
Y'UN 721R 14MAR UNDDEN HK2  
Y'UN1692R 14MAR DEUNAY LK2 
+0

那些是空行出现在你的输入,还是你只是想你的每行数据分开?你有尝试过什么吗?这是非常简单的东西。 –

+0

最后一个联合国总会有号码吗? –

+0

数据之间没有空行。是的,联合国总是在命令中有一个号码 –

回答

1

这里的关键是使用锚 '行尾' - $

sed -e 's/UN\([A-Z0-9]*\)$/LK\1/' 
+0

\ 1,这是什么意思。 –

+1

@DheebanChakkaravarthy它被第一对'()',基本的正则表达式东西匹配的内容所取代 – Vasfed

2

随着awk

awk '{sub(/UN/, "LK", $NF)}1' File 

在每行的最后一个字段($NF)中,用字符串LK("LK")替换模式UN(/UN/)。打印未受影响的行(1)。

输出:

Y'UN 310R 07MAR DAUNEN LK2 

Y'UN 720R 07MAR DENSUN HK2 

Y'UN 721R 14MAR UNDDEN HK2 

Y'UN1692R 14MAR DEUNAY LK2 
+1

您选择的语法意味着sub的输出被解释为一个字符串,然后与一个字符串'“1” ,所以它以你想要的方式做到了,但是方式相当怪异。我建议'awk'{sub(/ UN /,“LK”,$ NF)} 1''或者甚至直接写'print'语句。 –

+0

@TomFenech是100%正确的。实际上我们在大约15年前就有关于comp.lang.awk的讨论,并且都同意这里显示的语法不应该被使用,即使它比动作('sub()')更清晰的方式稍微简短一些。在条件部分的动作块和条件('1')中。 –

+0

哎呀...感谢各位指出...实际上这不是我真正想要的,因为输出正确而错过了括号。 –

相关问题