Это потому, что, когда вы вводите команду в командной строке, оболочка запускает для нее «расширения». Последний шаг - «Удаление кавычек», но он удаляет только кавычки, которые не были результатом какого-либо расширения. (Подробнее см. EXPANSIONS в man bash
.) Здесь кавычки являются частью раскрытия переменной, поэтому они не удаляются.
Вы можете ввести замену без кавычек, чтобы она работала:
cmd='sed -e s|abc|abc|g file'
$cmd
с grep
, извлекается только совпадающая часть ( -o
):
grep -o '[0-9].*'
[0-9]
будет соответствовать первой цифре, а . *
будет соответствовать остальным Пример:
$ grep -o '[0-9].*' <<<'SomeText.MoreText.Whatever.1.2.3.4-branch.ext'
1.2.3.4-branch.ext
Самым простым и доступным в большинстве оболочек POSIX является:
$ var='SomeText.MoreText.Whatever.1.2.3.4-branch.ext'
$ echo "${var#"${var%%[0-9]*}"}"
1.2.3.4-branch.ext
Таким образом, нет необходимости вызывать какие-либо внешние утилиты (expr, sed, awk и т. Д.), А также избегаются затраты времени на вызов такой утилиты (для короткие строки, такие как в этом случае, для длинных строк (десятки k) оболочка очень медленная).