Удалить из файла первые девять символов и два последних символа

Это:

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"
0
19.05.2021, 19:44
4 ответа
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
5
28.07.2021, 11:30

Использование расширения параметров bash:

string=hello123456789
echo ${string:9:-2}
567
5
28.07.2021, 11:30

Если содержимое вашего файла

hello123456789

Можно сделать:

sed 's/.\{9\}\(.\{3\}\).*/\1/' <your_file

Команда работает путем сопоставления:

  • 9 символов любого типа:.\{9\}
  • Вещи между \(и \)запоминаются и соответствуют 3 символы любого типа.\{3\}
  • Затем замените запомненным содержимым\1
0
28.07.2021, 11:30

Другой(bash)причудливый способ:

str="hello123456789"
[[ "$str" =~ ^.{9}(.*).{2}$ ]]
echo "${BASH_REMATCH[1]}"
0
28.07.2021, 11:30

Теги

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