Jogos a kontra, szigorúan csak a fixme részre reagáltam, a szövegkörnyezetet teljesen figyelmen kívül hagytam - így olyan választ adtam, ami s te felvetésedre éppen válasz, de az eredeti kérdéshez használhatatlan.
Ha általánosságban nézem a dolgot, és odáig már eljutottam, hogy egy shell-scriptben (!) be kell gyűjtenem valami adatot, le kell tárolnom egy változóban, valamint arra is oda kell figyelni, hogy valahol van benne egy db. kettőspont (és esetleg lehet mögötte másik), és el kell dobni a kezdő kettőspontot és az előtte levő egyebeket, akkor én 2 lehetőséget látok:
a)
v=$( valamilyen parancssorozat | X )
- ahol X végzi ezt a : alapú szabdalást
vagy pedig
b)
v=$( valamilyen parancssorozat )
v="${v#*:}"
- ahol a shell végzi el ugyanezt a szabdalást. ( A második értékadás helyett akár ezt is használhatnánk:
v="${v/*([^:]):}
de ezt írja le akinek két anyja van. Egyrészt mert a felhasználók minimum 99,99%-a nem is ismeri ezt a kibővített globbing formát, másrészt pedig na.)
Mindenki maga dönti el, hogy mit használ X-ként (*) vagy mikrooptimalizál-e vagy nem. Az első - a) - megoldásban van a "valamilyen parancssor" és egy plusz pipe létrehozás, két átirányítás (pipe-ba bele, pipe-ból kifele), az X processz létrehozása, és magának az X-nek a futási ideje. A második - b) - esetben szintén ott van a "valamilyen parancssor", és 2 db shell belső művelet - a kicsit ritkán használt formájú változóhelyettesítés és a változóértékadás. Sajnos az emberek többsége számára a második forma olvashatatlan, pedig a plusz processz létrehozás miatt az első jóval drágább (azaz lassabb).
(*) a teljesség igénye nélkül
- a leglogikusabbnak látszó a cut -d: -f2- # ha már pont erre van kitalálva
- de ugyanilyen jó lehet egy sed -e 's/^[^:]*://' # mondjuk ezt a regex miatt sokan undorodva kiköpik
- vagy egy awk '{ sub( "^[^:]*:", "", $0 ); print }' # sajnos a regex nem lett szebb
(és nyilván Perl, Python, PHP, Basic, Pascal és egyéb kódok is használhatók. Meg valszeg egy rakat egyéb standard util.