Разделение строки в Unix - PullRequest
0 голосов
/ 11 ноября 2019

Я пытаюсь разбить строку в сценарии оболочки Unix, но не могу понять. Любая помощь будет оценена. Ниже приведен пример

    olap4j-xmla-1.0.1.500,

    olap4j-xmla-1.2.0,

    olap4j-xmla-1.2.0.SNAPSHOT,

    olap4j-xmla-1.2.0.RELEASE

Вышеуказанные строки будут разделены так, что выходные данные будут сохранены в различных переменных, таких как

  var1=olap4j-xmla    var2=1.0.1.500

  var1=olap4j-xmla    var2=1.2.0

  var1=olap4j-xmla    var2=1.2.0    var3=SNAPSHOT

  var1=olap4j-xmla    var2=1.2.0    var3=RELEASE

Ответы [ 2 ]

2 голосов
/ 11 ноября 2019

Использование подстановок строк:

s='olap4j-xmla-1.0.1.500'
read var1 var2 <<< "${s%-*} ${s##*-}"

Теперь проверьте переменные:

declare -p var1 var2
declare -- var1="olap4j-xmla"
declare -- var2="1.0.1.500"

Обновление:

Спасибо за комментарий отpjh ниже Я понял, что OP требует 3 переменных для некоторых случаев вместо 2.

Глядя на это, я думаю, что следующее sed будет работать лучше:

sed -E 's/^(.+)-([0-9.]+)(\.([^0-9]+))?$/\1 \2 \4/' <<< "olap4j-xmla-1.2.0.SNAPSHOT"
olap4j-xmla 1.2.0 SNAPSHOT

sed -E 's/^(.+)-([0-9.]+)(\.([^0-9]+))?$/\1 \2 \4/' <<< "olap4j-xmla-1.2.0"
olap4j-xmla 1.2.0

Вывод sedможно вводить в read, как показано в приведенных выше примерах.

0 голосов
/ 11 ноября 2019
#!/bin/bash
while read LINE; do
  var1=$(cut -d '-' -f1,2 <<< "$LINE")
  tmp=$(cut -d '-' -f3 <<< "$LINE")
  var2=$(sed 's/\(.*\)\.[a-zA-Z]*$/\1/' <<< "$tmp")
  var3=$(sed -n 's/.*\.\([a-zA-Z]*$\)/\1/p' <<< "$tmp")
  echo -e "var1=$var1; var2=$var2; var3=$var3"
done < file.txt

Выход:

  var1=olap4j-xmla; var2=1.0.1.500; var3=
  var1=olap4j-xmla; var2=1.2.0; var3=
  var1=olap4j-xmla; var2=1.2.0; var3=SNAPSHOT
  var1=olap4j-xmla; var2=1.2.0; var3=RELEASE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...