5

我有一个这样的字符串:

data-c(huk24-small1);divider-bin-1.4.4;divider-conf-1.3.3-w(1,16);storage-bin-1.5.4;storage-conf-1.5.0-w(1);worker-bin-4.5.1;worker-conf-4.4.1-c(huk24)_20130620200658

其中应删除 14 位数字和下划线的时间戳。所以它应该是这样的:

data-c(huk24-small1);divider-bin-1.4.4;divider-conf-1.3.3-w(1,16);storage-bin-1.5.4;storage-conf-1.5.0-w(1);worker-bin-4.5.1;worker-conf-4.4.1-c(huk24)

如何在 bash 脚本中实现这一点?请注意,只有在确实有下划线和 14 位数字时才应该删除。

4

5 回答 5

4

使用参数扩展:

string=${string%_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]}
于 2013-06-20T18:15:21.153 回答
2

使用 sed:

echo $str | sed 's/_[0-9]\{14\}$//'

或者

echo ${str%_[0-9]*}
于 2013-06-20T18:15:23.730 回答
2

awk

awk --re-interval -F_ '{$NF~/^[0-9]{14}$/?NF--:NF}1' <<< $var
于 2013-06-20T18:16:32.623 回答
2

例如:

perl -plE 's/_\d{14}$//' < input > output

例如

echo 'data-c(huk24-small1);divider-bin-1.4.4;divider-conf-1.3.3-w(1,16);storage-bin-1.5.4;storage-conf-1.5.0-w(1);worker-bin-4.5.1;worker-conf-4.4.1-c(huk24)_20130620200658' | perl -plE 's/_\d{14}$//'

产生:

data-c(huk24-small1);divider-bin-1.4.4;divider-conf-1.3.3-w(1,16);storage-bin-1.5.4;storage-conf-1.5.0-w(1);worker-bin-4.5.1;worker-conf-4.4.1-c(huk24)
于 2013-06-20T18:16:47.203 回答
2

使用bash正则表达式:

[[ $string =~ ^(.*)_[[:digit:]]{14}$ ]] && string=${BASH_REMATCH[1]}
于 2013-06-20T18:38:41.847 回答