Несоответствие /dev/fd

Ваш вопрос не очень точен с точки зрения структуры строки, которую вы хотите преобразовать. Итак, я собираюсь предположить, что ваши входные характеристики:

  • Несколько пар KEY=VALUEпредоставляются в одной строке.
  • Каждая пара будет отделена от других пар символом /.
  • /следует размещать только между парами (, а не в начале или в конце строки ).
  • Не допускается последовательное повторение /.
  • В каждой паре ключ не может быть пустым , но значение может быть пустым(=необязательно, если значение пустое ).
  • Каждый ключ и значение не могут содержать символы =и/или /.

А нужно было извлечь ключи , затем вывести их через запятую...


Подход на основе Sed -(Чит)

Это можно сделать из вашего скрипта, запустив ввод через одну -строку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.

0
13.01.2021, 05:17
0 ответов

Теги

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