Как извлечь первые два символа строки в сценариях оболочки?

Очень полезно, когда у Вас есть несколько классов с тем же именем в нескольких включенных пространствах имен. Например...

namespace Something.From.SomeCompanyA {
    public class Foo {
        /* ... */
    }
}

namespace CompanyB.Makes.ThisOne {
    public class Foo {
        /* ... */
    }
}

можно использовать псевдонимы, чтобы сделать компилятор счастливым и сделать вещи более ясными для Вас и других в Вашей команде:

using CompanyA = Something.From.CompanyA;
using CompanyB = CompanyB.Makes.ThisOne;

/* ... */

CompanyA.Foo f = new CompanyA.Foo();
CompanyB.Foo x = new CompanyB.Foo();
105
задан Ciro Santilli 新疆改造中心法轮功六四事件 7 August 2018 в 06:34
поделиться

8 ответов

Вероятно, наиболее эффективный метод, если вы используете оболочку 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 - они доставляют первые два символа каждой строки ввода.

Ничего из этого не имеет значения, если вы уверены, что вводите одну строку, все они имеют одинаковые эффект.

163
ответ дан 24 November 2019 в 03:56
поделиться

, если mystring = USCAGoleta9311734.5021-120.1287855805

print substr(mystring,0,2)

выведет US

, где 0 - начальная позиция, а 2 - как много символов читать

0
ответ дан 24 November 2019 в 03:56
поделиться

Это то, что вам нужно?

my $string = 'USCAGoleta9311734.5021-120.1287855805';

my $first_two_chars = substr $string, 0, 2;

ref: substr

0
ответ дан 24 November 2019 в 03:56
поделиться
perl -ple 's/^(..).*/$1/'
0
ответ дан 24 November 2019 в 03:56
поделиться

colrm - удалить столбцы из файла

Чтобы оставить первые два символа, просто удалите столбцы, начиная с 3

cat file | colrm 3
4
ответ дан 24 November 2019 в 03:56
поделиться

Если вы в bash , вы можете сказать:

bash-3.2$ var=abcd
bash-3.2$ echo ${var:0:2}
ab

Это может быть именно то, что вам нужно…

7
ответ дан 24 November 2019 в 03:56
поделиться

Вы получили несколько хороших ответов, и я бы сам выбрал встроенный Bash, но поскольку вы спросили о sed и awk и ( почти ) никто другой не предлагал решений на их основе, я предлагаю вам следующие:

echo "USCAGoleta9311734.5021-120.1287855805" | awk '{print substr($0,0,2)}'

и

echo "USCAGoleta9311734.5021-120.1287855805" | sed 's/\(^..\).*/\1/'

awk должно быть довольно очевидным, но вот объяснение sed one:

  • заменить «s /»
  • группу «()» из двух любых символов «..», начиная с начала строки «^» и за которой следует любой символ "." повторяется ноль или более раз "*" (обратная косая черта необходима для экранирования некоторых специальных символов)
  • через "/" содержимое первого (и только в данном случае) group (здесь обратная косая черта - это специальный escape-код, относящийся к совпадающему подвыражению)
  • done "/"
31
ответ дан 24 November 2019 в 03:56
поделиться

Самый простой способ -

${string:position:length}

Где это извлекает подстроку $ length из $ string в $ position .

Это встроенная функция bash, поэтому awk или sed не требуются.

49
ответ дан 24 November 2019 в 03:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: