Назначение частей имен файлов переменным в bash - PullRequest
0 голосов
/ 15 января 2020

У меня есть список файлов в папке, для которого я пытаюсь создать список в файле. json очень конкретным образом c. В основном, беря первую, вторую и третью части имен файлов, присваивая им переменные и затем пропуская их.

Имена файлов:

a_test_1-aws.xml
b_test_2-aws.xml
a_stage_3-az.xml
c_prod_1-az.xml

Пример записи в. json файле:

{"name":"$a | $b - $c", "value":"/root/environment/$d"}

Как это должно выглядеть:

{"name":"a | test_1 - aws", "value":"/root/environment/a_test_1-aws.xml"},
{"name":"b | test_2 - aws", "value":"/root/environment/b_test_2-aws.xml"},
{"name":"a | stage_3 - az", "value":"/root/environment/a_stage_3-az.xml"},
{"name":"c | prod_1 - az", "value":"/root/environment/c_prod_1-az.xml"}

Где:

$a = a/b/c (anything that goes before "_" sign)
$b = test/stage/prod (anything that goes before the "-" sign)
$c = aws/az (anything that goes before ".xml")
$d = "a_test_1-aws.xml" (the .xml file name itself)

Ответы [ 3 ]

0 голосов
/ 15 января 2020

Вы можете перебирать все xml имена файлов в каталоге и разбивать переменные в каждой строке. затем добавьте сгенерированный результат в json_file:

#!/bin/bash

# template
JSON_STRING='{"name":"%s","value":"%s"},\n'

for file in $(ls *xml); do
  A=$(echo $file | cut -d "_" -f1)
  B=$(echo $file | cut -d "_" -f2-3 | cut -d '-' -f1)
  C=$(echo $file | cut -d "-" -f2   | cut -d "." -f1)
  D=$(echo $file)
  # using readlink to get the full path
  printf "$JSON_STRING" "$A | $B - $C" "$(readlink -f $D)" >> json_file
done
# removing extra comma
truncate -s-2 json_file
0 голосов
/ 15 января 2020

Если вы хотите, чтобы выходные данные были JSON объектами, тогда лучше использовать JSON осведомленные инструменты.
Xidel и EXPath File Module может легко сделать то, что вы хотите:

xidel -s -e '
  file:list(.) ! {
    "name":replace(.,"(.)_(.+?)-(.+?)\..+","$1 | $2 - $3"),
    "value":file:current-dir()||.
  }
' --printed-json-format=compact
{"name": "a | stage_3 - az", "value": "/root/environment/a_stage_3-az.xml"}
{"name": "a | test_1 - aws", "value": "/root/environment/a_test_1-aws.xml"}
{"name": "b | test_2 - aws", "value": "/root/environment/b_test_2-aws.xml"}
{"name": "c | prod_1 - az", "value": "/root/environment/c_prod_1-az.xml"}

Вы можете опустить --printed-json-format=compact, если хотите, чтобы вывод был красивым.

0 голосов
/ 15 января 2020

Разделение строк на переменные a, b, c, d является прямой передачей с использованием bash расширение параметра с удалением подстроки. Расширения параметров ${var#pattern} обрезаются слева, хотя 1-е вхождение pattern, ${var##pattern} обрезается слева до последнего вхождения pattern. Расширение с использованием % и %% работает так же справа.

Если использовать это в коротком сценарии для разделения всех имен в вашем файле, вы получите:

#!/bin/bash

while read -r d || [ -n "$d" ]; do
    a="${d%%_*}"    ## trim from right though leftmost "_"
    b="${d%-*}"     ## trim from right through rightmost "-"
    b="${b#*_}"     ## trim from left through leftmost "_"
    c="${d%.*}"     ## trim from right through rightmost "."
    c="${c##*-}"    ## trim from left trough rightmost "-"
    printf "\na: %s\nb: %s\nc: %s\nd: %s\n" "$a" "$b" "$c" "$d"
done < "$1"

Пример использования / вывода

С вашими .xml именами файлов в файле names вы получите:

$ bash splitnames.sh names

a: a
b: test_1
c: aws
d: a_test_1-aws.xml

a: b
b: test_2
c: aws
d: b_test_2-aws.xml

a: a
b: stage_3
c: az
d: a_stage_3-az.xml

a: c
b: prod_1
c: az
d: c_prod_1-az.xml

После того, как вы отделите части файл, вместо того, чтобы соединять их вместе с bash, вам лучше обслужить утилиту, которая .json знает и может проверить результат. jq - это инструмент, который широко используется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...