Это:
str=( -name "*.conf" -o -name "test test" )
Обычно ()совпадает с этим:
str=( "-name" "*.conf" "-o" "-name" "test test" )
Большинство этих кавычек опущены, потому что они не нужны. -Нет подстановочных знаков для расширения имени файла или пробельных символов из IFS по умолчанию, которые могут вызвать разделение полей для этих элементов.
Таким образом, эквивалент может быть:
declare -a str
str[0]="-name"
str[1]="*.conf"
str[2]="-o"
str[3]="-name"
str[4]="test test"
Или:
declare -a str
str[0]=-name
str[1]=*.conf # no filename expansion in variable assignment
str[2]=-o
str[3]=-name
str[4]="test test"
sed 's/^.........\(.*\)..$/\1/' file
или
sed 's/^.\{9\}\(.*\)..$/\1/' file
или, используя нестандартную -, но часто реализуемую -E
опцию, позволяющую использовать расширенные регулярные выражения,
sed -E 's/^.{9}(.*)..$/\1/' file
Все они сначала соответствуют девяти символам в начале строки, затем любому количеству символов в середине строки (они захватываются )и, наконец, двум символам в конце. Привязка с ^
и $
на самом деле здесь не нужна, так как средняя часть выражения заставляет первый и последний бит выражения совпадать в начале и конце строки в любом случае. Вся строка заменяется захваченными символами в середине, сколько бы их ни было.
Другой подход сsed
:
sed -e 's/.\{9\}//' -e 's/..$//' file
Это первое выражение удаляет первые девять символов, заменяя их ничем, а второе выражение удаляет последние два символа аналогичным образом. Второе выражение требует привязки в конце строки с помощью $
, но первое выражение не нужно привязывать, поскольку по умолчанию оно соответствует началу строки.
Если строка находится в переменной оболочки var
, то использование этих двух стандартных подстановок переменных сначала удалит первые девять,тогда последние два символа строки(?
соответствуют любому символу при использовании в шаблоне подстановки оболочки):
var=${var#?????????}
var=${var%??}
Это имитирует последний вариант с sed
выше в том смысле, что он сопоставляет и удаляет определенное количество символов в начале и конце строки, не беспокоясь о средней части строки вообще.
Проверка:
$ var=hello123456789
$ var=${var#?????????}
$ var=${var%??}
$ printf '%s\n' "$var"
567
Использование расширения параметров bash:
string=hello123456789
echo ${string:9:-2}
567
Если содержимое вашего файла
hello123456789
Можно сделать:
sed 's/.\{9\}\(.\{3\}\).*/\1/' <your_file
Команда работает путем сопоставления:
.\{9\}
\(
и \)
запоминаются и соответствуют 3 символы любого типа.\{3\}
\1
Другой(bash
)причудливый способ:
str="hello123456789"
[[ "$str" =~ ^.{9}(.*).{2}$ ]]
echo "${BASH_REMATCH[1]}"