2013-06-20 11 views
5

Mam ciąg tak:usunąć ostatnie 14 cyfr z ciągu znaków i podkreślenia, jeśli istnieje 14 cyfr

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

gdzie datownik z 14 cyfr i podkreślenia powinny zostać usunięte. Tak powinno to wyglądać tak:

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)

Jak mogę to osiągnąć w skrypcie bash? Pamiętaj, że usunięcie powinno nastąpić tylko wtedy, gdy naprawdę jest podkreślenie i 14 cyfr.

Odpowiedz

2

Zastosowanie sed:

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

lub

echo ${str%_[0-9]*} 
+1

+1 dla czytelności! ale proszę użyj cytatów: 'echo" $ str "| sed 's/_ [0-9] \ {14 \} $ // '' # przykład zawiera str zawierający; i inne znaki –

4

pomocą parametru rozprężania:

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]} 
+1

Albo śmieszniej (i krótszy): 'printf -v re '% 14s'; string = $ {string% _ $ {re ///[[: digit:]]}} ' –

2

z awk:

awk --re-interval -F_ '{$NF~/^[0-9]{14}$/?NF--:NF}1' <<< $var 
+0

dlaczego nie po prostu '$ awk -F_ '{print $ 1}' <<< $ var', ponieważ w łańcuchu testowym występuje tylko jeden podkreślnik. –

+0

@FredrikPihl Tak, ale wymaganiem OP było wyeliminowanie drugiej części TYLKO JEŚLI była to cyfra o długości 14. –

+1

tak, widziałem to, zły przykładowy ciąg, więc pomyślałem, że będę nieprzyjemny :-) –

2

Na przykład:

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

np

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}$//' 

produkuje:

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) 
2

bash Użyj wyrażeń regularnych:

[[ $string =~ ^(.*)_[[:digit:]]{14}$ ]] && string=${BASH_REMATCH[1]} 
+0

Całkiem fajnie .. +1 –