2014-01-31 142 views
0

我有表名,我想重新命名: 这里是一些例子:删除下划线

AB_DC_JDZOJZD_HST_2090 
AB_DC_JDZODSJOJZD_HIST_2500 
AB_DC_JDZ_JJKOJZD_HIT_2050 

但我想:

AB_DC_JDZOJZD 
AB_DC_JDZODSJOJZD 
AB_DC_JDZ_JJKOJZD 

我的问题是: 如何从词的结尾删除

+0

什么逻辑背后?至'_H'?倒数第二个下划线? – fedorqui

回答

4

假设你要删除的最后两个领域通过_分隔,你可以说:

sed -r 's/(_[^_]*){2}$//' filename 

您的输入,它会产生:

AB_DC_JDZOJZD 
AB_DC_JDZODSJOJZD 
AB_DC_JDZ_JJKOJZD 

为了好玩,您还可以使用revcut来产生相同的输出:

rev filename | cut -d_ --complement -f1,2 | rev 
+0

感谢您的回答!我试过sed's/_ [a-zA-Z0-9] * _ [a-zA-Z0-9] * $ //,哪个更好? – user2269756

+1

@ user2269756这取决于你。 'AB_DC_JDZOJZD_HS:你已经建议将不匹配输入等版本T_2090' – devnull

0

您可以使用awk

awk -F_ '{NF-=2}8' OFS="_" file 
AB_DC_JDZOJZD 
AB_DC_JDZODSJOJZD 
AB_DC_JDZ_JJKOJZD 

这消除了使用_作为分隔符的最后两个领域。

1

只需使用参数扩展在shell:

while read word; do echo "${word%_*_*}"; done <<END 
AB_DC_JDZOJZD_HST_2090 
AB_DC_JDZODSJOJZD_HIST_2500 
AB_DC_JDZ_JJKOJZD_HIT_2050 
END 
AB_DC_JDZOJZD 
AB_DC_JDZODSJOJZD 
AB_DC_JDZ_JJKOJZD 
+0

的工作,但在资源非常重比作一个AWK或者如果输入是有点长的sed。仍然给予1UP – NeronLeVelu

+0

我会用“资源重”的争论 - 毕竟你不产卵任何其他进程。我会承认比较慢。 –