Prawdopodobnie najbardziej efektywny sposób, jeśli używasz powłoki bash
(i wydaje się, w oparciu o komentarze), jest użycie wariantu podciąg ekspansji parametr:
pax> long="USCAGol.blah.blah.blah"
pax> short="${long:0:2}" ; echo "${short}"
US
Spowoduje to ustawienie short
jako pierwszych dwóch znaków long
. Jeśli long
jest krótszy niż dwa znaki, short
będzie identyczny.
Ta metoda działająca w powłoce jest zwykle lepsza, jeśli zamierzasz robić to dużo (na przykład 50 000 razy na raport, o ile wspominasz), ponieważ nie ma kosztów związanych z tworzeniem procesów. Wszystkie rozwiązania korzystające z programów zewnętrznych będą cierpieć z powodu tego obciążenia.
Jeśli również chciał zapewnić minimalną długości, można pad go przed parze z czymś takim:
pax> long="A"
pax> tmpstr="${long}.."
pax> short="${tmpstr:0:2}" ; echo "${short}"
A.
Zapewni to, że nic mniej niż dwóch znaków zostało wyściełane na prawo z kropkami (lub czymś innym, po prostu zmieniając znak używany podczas tworzenia tmpstr
). Nie jest jasne, czy tego potrzebujesz, ale pomyślałem, że wstawię to dla kompletności.
Mimo, że istnieją różne sposoby, aby to zrobić z programów zewnętrznych (takich jak, jeśli nie masz bash
dostępne dla użytkownika), z których niektóre są:
short=$(echo "${long}" | cut -c1-2)
short=$(echo "${long}" | head -c2)
short=$(echo "${long}" | awk '{print substr ($0, 0, 2)}'
short=$(echo "${long}" | sed 's/^\(..\).*/\1/')
Pierwsze dwa (cut
i head
) są identyczne dla ciągu jednoliniowego - w zasadzie oba dają tylko pierwsze dwa znaki. Różnią się one tym cut
daje dwa pierwsze znaki każdego wiersza i head
daje dwa pierwsze znaki całej wejścia
Trzeci wykorzystuje funkcję awk
podciąg do wyodrębnienia dwóch pierwszych znaków i czwarty używa sed
grup przechwytujących (używając ()
i \1
), aby przechwycić pierwsze dwa znaki i zastąpić je całą linią.Oba są podobne do cut
- dostarczają pierwsze dwa znaki każdej linii na wejściu.
Nie ma to znaczenia, jeśli masz pewność, że dane wejściowe są pojedynczą linią, wszystkie mają identyczny efekt.
Dziękuję wszystkim. Skończyło się na tym, że użyłem "cut -c1-2", szczerze mówiąc, nie wiedziałem nawet, że istnieje "cut". Chciałbym powiedzieć, że jestem dość doświadczony na linii poleceń - ale najwyraźniej muszę się jeszcze wiele nauczyć. – Greg
@Greg, pamiętaj tylko, że cięcie jest uruchamiane jako oddzielny proces - będzie wolniejsze niż rozwiązanie wewnętrzne bash, które umieściłem obok niego w mojej odpowiedzi. Nie ma to znaczenia, chyba że przetwarzasz ogromne zbiory danych, ale musisz o tym pamiętać. – paxdiablo
[Edytuj] Właściwie, myślę, że ta linia kodu zostanie prawdopodobnie wykonana około 50 000 razy na raport. Mogę więc po prostu zastosować wewnętrzną metodę Bash - która, jak powiedziałeś, pozwoli zaoszczędzić trochę potrzebnych zasobów. – Greg