我有表名,我想重新命名: 這裏是一些例子:刪除下劃線
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
我的問題是: 如何從詞的結尾刪除?
我有表名,我想重新命名: 這裏是一些例子:刪除下劃線
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
我的問題是: 如何從詞的結尾刪除?
假設你要刪除的最後兩個領域通過_
分隔,你可以說:
sed -r 's/(_[^_]*){2}$//' filename
您的輸入,它會產生:
AB_DC_JDZOJZD
AB_DC_JDZODSJOJZD
AB_DC_JDZ_JJKOJZD
爲了好玩,您還可以使用rev
和cut
來產生相同的輸出:
rev filename | cut -d_ --complement -f1,2 | rev
感謝您的回答!我試過sed's/_ [a-zA-Z0-9] * _ [a-zA-Z0-9] * $ //,哪個更好? – user2269756
@ user2269756這取決於你。 'AB_DC_JDZOJZD_HS:你已經建議將不匹配輸入等版本T_2090' – devnull
您可以使用awk
awk -F_ '{NF-=2}8' OFS="_" file
AB_DC_JDZOJZD
AB_DC_JDZODSJOJZD
AB_DC_JDZ_JJKOJZD
這消除了使用_
作爲分隔符的最後兩個領域。
只需使用參數擴展在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
的工作,但在資源非常重比作一個AWK或者如果輸入是有點長的sed。仍然給予1UP – NeronLeVelu
我會用「資源重」的爭論 - 畢竟你不產卵任何其他進程。我會承認比較慢。 –
什麼邏輯背後?至'_H'?倒數第二個下劃線? – fedorqui