Вероятно, наиболее эффективный метод, если вы используете оболочку bash
(а вы, похоже, основываетесь на ваших комментариях), - это использовать подстроковой вариант расширения параметра:
pax> long="USCAGol.blah.blah.blah"
pax> short="${long:0:2}" ; echo "${short}"
US
Это установит short
в качестве первых двух символов long
. Если long
короче двух символов, short
будет идентичным ему.
Этот метод в оболочке обычно лучше, если вы собираетесь делать это много (например, 50000 раз на отчет, как вы упомянули), так как нет затрат на создание процесса. Все решения, использующие внешние программы, пострадают от этих издержек.
Если вы также хотите обеспечить минимальную длину, вы можете дополнить ее до того, как что-то вроде:
pax> long="A"
pax> tmpstr="${long}.."
pax> short="${tmpstr:0:2}" ; echo "${short}"
A.
Это гарантирует, что все, что меньше двух символов в длину, будет дополнено справа точками (или что-то еще, просто изменив символ, использованный при создании tmpstr
). Не ясно, что вам это нужно, но я подумал, что для полноты я вставлю это.
Сказав это, существует множество способов сделать это с внешними программами (например, если у вас нет bash
доступных для вас), некоторые из которых:
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/')
Первые два (cut
и head
) идентичны для однострочной строки - они в основном оба просто возвращают вам первые два символа. Они отличаются тем, что cut
даст вам первые два символа каждой строки, а head
даст вам первые два символа всего ввода
Третий использует функцию подстроки awk
для извлечения первых двух символов, а четвертый использует sed
группы захвата (используя ()
и \1
), чтобы захватить первые два символа и заменить все Линия с ними. Они оба похожи на cut
- они доставляют первые два символа каждой строки на входе.
Ничто из этого не имеет значения, если вы уверены, что ваш ввод - одна строка, они все имеют одинаковый эффект.