Рекомендуемым инструментом для переименования пакетов файлов является rename
, это сделает вашу работу.
rename -n 'our $i++; s/_DNH_\K\d+_\d+(.*)\..*/${i}_8$1/' DA*.dat.*
Ваш вопрос не очень точен с точки зрения структуры строки, которую вы хотите преобразовать. Итак, я собираюсь предположить, что ваши входные характеристики:
KEY=VALUE
предоставляются в одной строке. /
. /
следует размещать только между парами (, а не в начале или в конце строки ). /
. =
необязательно, если значение пустое ).=
и/или /
. А нужно было извлечь ключи , затем вывести их через запятую...
Это можно сделать из вашего скрипта, запустив ввод через одну -строкуsed
-на основе операции поиска/замены:
sed 's/=[^/]*//g;y/\//,/'
=
вместе с последовательными символами, отличными от -/
, следующими за ним ; затем замените все символы /
запятыми. Следующий пример кода (должен работать в любой оболочке POSIX, а не только в GNU Bash):
#!/bin/sh
# This is ssv-keys-sed.sh
echo -n "input: "
IFS= read -r INPUT
echo -n "output: "
echo "$INPUT" | sed 's/=[^/]*//g;y/\//,/'
Пример запуска:
$ sh ssv-keys-sed.sh
input: keyA=valueA/ k e y B =/keyC/keyD=valueD
output: keyA, k e y B,keyC,keyD
Если вы настаиваете на том, чтобы сделать это, используя сценарий оболочки -на основе синтаксического анализа , а не обман на основе подстановки -, описанный выше, вы можете поиграть с IFS
переменной-разделителем слов и for
циклом. Обязательно обратите внимание на цитирование (и его отсутствие )в различных контекстах; это может сделать или сломать программу , так как мы возимся с внутренним разделителем слов оболочки.
IFS
, а затем приняты как несколько токенов. Следующий скрипт должен работать в любой оболочке POSIX, а не только в GNU Bash...
#!/bin/sh
# This is ssv-keys-parse.sh
# Show input prompt
echo -n "input: "
# Read one line from standard input into variable INPUT,
# no parsing or escape-processing
IFS= read -r INPUT
# Prepare empty output variable OUTPUT
OUTPUT=""
# Set parsing separator for extracting pairs
IFS="/"
# Extract each pair
# ^ Note that all pairs will be extracted before the loop is run,
# so separator set inside the loop won't effect pairs extraction.
for PAIR in $INPUT
do
# Set parsing separator for extracting key
IFS="="
for KEY in $PAIR
do
# Stop at the first split part of key-value pair (i.e. key)
break
done
# If this is not the first key in the output, append comma to the output
if [ -n "$OUTPUT" ]
then
OUTPUT="$OUTPUT,"
fi
# Append the extracted key to the output
OUTPUT="$OUTPUT$KEY"
done
# Emit output
echo "output: $OUTPUT"
Пример запуска:
$ sh ssv-keys-parse.sh
input: keyA=valueA/ k e y B =/keyC/keyD=valueD
output: keyA, k e y B,keyC,keyD
П.С. Мои тестовые запуски выполняются с оболочкой Debian Almquist, установленной как /bin/sh
, и sed
с GNU sed.