Что команда linux shell возвращает часть строки?

Я хочу найти команду linux, которая может вернуть часть строки. В большинстве языков программирования это функция substr(). Имеет ли bash любую команду, которая может быть использована для этой цели. Я хочу, чтобы иметь возможность сделать что-то вроде этого... substr "abcdefg" 2 3 - печатает cde.


Последующий аналогичный вопрос:

Ответ 1

Если вы ищете утилиту оболочки, чтобы сделать что-то подобное, вы можете использовать команду cut.

Чтобы взять ваш пример, попробуйте:

echo "abcdefg" | cut -c3-5

что дает

cde

Где -cN-M сообщает команде cut для возврата столбцов N в M включительно.

Ответ 2

Из bash manpage:

${parameter:offset}
${parameter:offset:length}
        Substring  Expansion.   Expands  to  up  to length characters of
        parameter starting at the character  specified  by  offset.
[...]

Или, если вы не уверены в наличии bash, используйте cut.

Ответ 3

В "чистом" bash у вас есть много инструментов для (под) манипуляций строк, главным образом, но не исключительно в расширении параметров:

${parameter//substring/replacement}
${parameter##remove_matching_prefix}
${parameter%%remove_matching_suffix}

Индексированное расширение подстроки (специальные поведения с отрицательными смещениями и в более новых базах, отрицательные длины):

${parameter:offset}
${parameter:offset:length}
${parameter:offset:length}

И, конечно, много полезных расширений, которые работают на том, является ли параметр нулевым:

${parameter:+use this if param is NOT null}
${parameter:-use this if param is null}
${parameter:=use this and assign to param if param is null}
${parameter:?show this error if param is null}

У них более правильное поведение, чем указано в списке, и, как я уже сказал, существуют другие способы манипулирования строками (общий $(command substitution) в сочетании с sed или любым другим внешним фильтром). Но их так легко найти, набрав man bash, что я не чувствую, что это необходимо для дальнейшего распространения этого сообщения.

Ответ 4

В bash вы можете попробовать следующее:

stringZ=abcABC123ABCabc
#       0123456789.....
#       0-based indexing.

echo ${stringZ:0:2} # prints ab

Дополнительные примеры в Проект документации Linux

Ответ 5

expr(1) имеет подкоманду substr:

expr substr <string> <start-index> <length>

Это может быть полезно, если у вас нет bash (возможно, встроенного Linux), и вам не нужен дополнительный процесс "эха", который вам нужен для использования cut (1).

Ответ 6

${string:position:length}