2014-01-31 140 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

我會用「資源重」的爭論 - 畢竟你不產卵任何其他進程。我會承認比較慢。 –