Только при использованииgrep
:
grep -Po 'VERSION="[0-9]+ \(\K[^)]+' /etc/os-release
Попробуйте (вывод на момент написания этого поста):
$ docker run --rm debian:stable-slim grep -Po 'VERSION="[0-9]+ \(\K[^)]+' /etc/os-release
stretch
${param:offset:length}
был введен ksh93
¹, он не был доступен в ksh88
. Поэтому вам нужно убедиться, что скрипт интерпретируется ksh93, а не ksh88.
Также помните, что расширения параметров должны заключаться в кавычки в большинстве Bourne -подобно оболочкам, по крайней мере, в контекстах списка.
Вы можете ввести Esc , Ctrl + V в интерактивном ksh
с включенным строковым редактором (после set -o emacs
или vi
или gmacs
), чтобы проверить его версию.
Здесь вместо ${filename:10:14}
можно использовать
filename=25_032021_abcdefghijklmn.txt
id="${filename%.*}" # remove extension from the end
id="${id#*_*_}" # remove up to second _ from the start
mv "/u/foo/test/25_032021_test_$id.txt" \
"/u/foo/test/25_032021_test_$id.txt.tmpExtension"
Чтобы удалить 10 символов из начала вместо *_*_
, используйте ${param#??????????}
. Так,эквивалент id=${filename:10:14}
при условии, что filename
имеет не менее 24 символов, будет:
id=${filename#??????????} # remove 10 characters from the start
id=${id%"${id#??????????????}"} # remove from the end: $id stripped of
# its first 14 characters
Эти ${param#pattern}
и ${param%pattern}
были введены в более ранних версияхksh
(уже в ksh85 )и даже указаны POSIX для sh
, поэтому вы должны найти их в любом sh
или ksh
. ] В эти дни.
Или можно было пойти древним путем от до-ksh дней и прибегнуть к expr
².
id=`expr "x$filename" : 'x.\{10\}\(.\{14\}\)'`
или:
id=`expr "x$filename" : 'x.\{10\}\(.\{0,14\}\)'`
(для более строгого эквивалента ksh93 ${filename:10:14}
, когда $filename
содержит менее 24 символов ).
Осторожно, expr
вернет статус выхода с ошибкой, если то, что он выводит, является представлением числа 0, пустой строки или регулярного выражения, поэтому вам может потребоваться добавить || true
, если у вас есть включил опцию errexit
, чтобы оболочка не закрывалась, например, для файлов с именем 123456789_00000000000000.txt
.
Этот expr
подход также не будет работать должным образом, если id заканчивается символами новой строки (, которые будут удалены при подстановке команды ).
¹ также доступно в bash
с версии 2.0 (с конца 1996 года ), mksh
с версии R30 (2007 года )и zsh
с версии 4.3.11 (с конца 2010 года ), хотя у zsh
было $param[first,last]
с версии 2.0 в 1991 году.
² хотя оператор регулярных выражений \{n,m\}
сегодня является стандартным, он не был бы доступен в те дни до -ksh, и вам пришлось бы, например, заменить .\{10\}
на ..........
.