Вероятно, наиболее эффективный метод, если вы используете bash
оболочку (и вы, как представляется, на основе ваших комментариев), заключается в использовании подстроки вариант расширения параметра:
pax> long="USCAGol.blah.blah.blah"
pax> short="${long:0:2}" ; echo "${short}"
US
Это установит short
как первые два символа long
. Если long
короче двух символов, то short
будет идентичен ему.
Этот метод в оболочке обычно лучше, если вы собираетесь делать это много (например, 50 000 раз за отчет, как вы упоминаете), поскольку накладные расходы на процесс отсутствуют. Все решения, которые используют внешние программы, будут страдать от этих накладных расходов.
Если вы также хотели, чтобы обеспечить минимальную длину, вы могли бы подушечка его, прежде чем руки что-то вроде:
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
- они доставляют первые два символа каждой строки на входе.
Ничего из этого не имеет значения, если вы уверены, что ваш вход является одной строкой, все они имеют одинаковый эффект.
Спасибо всем. Я закончил тем, что использовал «cut -c1-2», честно говоря, я даже не знал, что там был «разрез». Я бы хотел сказать, что я довольно опытный в командной строке, но, видимо, мне есть чему поучиться. – Greg
@Greg, просто имейте в виду, что разрез выполняется как отдельный процесс - он будет медленнее, чем внутреннее решение bash, которое я разместил рядом с ним в своем ответе. Это не будет иметь никакого значения, если вы не обрабатываете огромные наборы данных, но вы должны помнить об этом. – paxdiablo
[Изменить] На самом деле, я думаю, что эта строка кода, вероятно, будет выполнена около 50 000 раз за отчет. Поэтому я могу просто пойти с внутренним методом Bash, который, как вы сказали, сохранит некоторые необходимые ресурсы. – Greg