我有表名,我想重新命名: 这里是一些例子:删除下划线
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