Опять же, я рекомендую настоящий анализатор JSON, но -
Во-первых, извинения.моя копия / вставка была повреждена.У него есть встроенный ^ C-break, и нет конечных паренов или кавычек.
mea culpa.
Разбивка:
id=$( sed -En '/"id"\s*:/ { s/.*"id"\s*:\s*"([^"]+)".*/\1/; p; }' get.txt )
id=
- стандартное присвоение переменной.
$( ... )
запускает его содержимое и возвращает стандартный вывод, который здесь будет назначен в конструкции id=$( ... )
.
Итак, давайте посмотрим на использование sed
.
-E
расширенное сопоставление с образцом, поэтому (например) мне не нужно ставить обратную косую черту в скобки, чтобы сделать их метасимволами.
-n
говорит, что ничего не печатать, если я явно не запрашиваю это.
программа:
/"id"\s*:/ { ... }
говорит о необходимости выполнения команд между фигурными скобками, когда строка соответствует шаблону между косыми чертами.
шаблон представляет собой литерал "id"
, за которым следует любойчисло (0 или более) символов пробела (\s*
), за которыми следует двоеточие.
s/.*"id"\s*:\s*"([^"]+)".*/\1/; p;
- список команд для запуска на совпадающих строках.
подстановка: s/<find>/<replace>/;
В этом случае это .*"id"\s*:\s*"([^"]+).*
;.*
соответствует любому количеству «любого» символа.Смотрите руководство для деталей.Это отбрасывает все до той части, которая нам небезразлична."id"\s*:\s*"
говорит, что нужно найти "id"
, ноль или более пробелов, двоеточие, еще один ноль или более пробелов, за которым следует символ двойной кавычки ([^"]+)
- важная часть - парены говорят, что нужно помнить, что между ними;[^"]+
означает один или несколько символов без двойных кавычек.".*
выбрасывает кавычку в конце данных и любые / все завершающие символы позади них.
На этом этапе сопоставленные данные должны быть значением между кавычками, обозначенными "id":
,и должен быть в storefd в \1
.
Часть - это \1
, поэтому вся строка должна быть обрезана до нужной вам части.
Например, p;
, чтобы напечататьтеперь обрезанная строка, поэтому идентификатор должен храниться в переменной.
Убедитесь, что в ваших данных не более одного идентификатора, соответствующего этим условиям ....
РЕДАКТИРОВАТЬ
Поместить их в массив.Дублировал строку несколько раз.
$: id=( $( sed -En '/"id"\s*:/ { s/.*"id"\s*:\s*"([^"]+)".*/\1/; p; }' get.txt ) )
$: printf "[%s]\n" "${id[@]}"
[first-0a3c62a9-2f61-4e78-802a-2a6b31e43af8]
[second-0a3c62a9-2f61-4e78-802a-2a6b31e43af8]
[3rd-0a3c62a9-2f61-4e78-802a-2a6b31e43af8]
[4th-0a3c62a9-2f61-4e78-802a-2a6b31e43af8]
[5th-0a3c62a9-2f61-4e78-802a-2a6b31e43af8]
[last-0a3c62a9-2f61-4e78-802a-2a6b31e43af8]
Следующее редактирование
cf:
for i in "${id[@]}"
do curl -X DELETE $url"${id[@]}" -H "Content-Type: application/json"
done
"$token"
Во-первых, не так ли?получить ошибку в "$token"
?
Вероятно, следует сказать что-то неопределенное, например
bash: Authorization:: command not found
Second - for i in "${id[@]}"
устанавливает i
для каждого id
по очереди, но тогда вы никогда не используетеэто в вашей петле.Вместо этого вы используете
curl -X DELETE $url"${id[@]}" -H "Content-Type: application/json"
, который не будет делать то, что вы хотите.
Посмотрите на этот пример:
$: x=( a b c )
$: for i in "${x[@]}"
> do echo "Right: id is '$i'"
> echo "Wrong: id is '${x[@]}'"
> done
Right: id is 'a'
Wrong: id is 'a b c'
Right: id is 'b'
Wrong: id is 'a b c'
Right: id is 'c'
Wrong: id is 'a b c'
То, что вы сделали, неправильноодин.Попробуйте это так:
for i in "${id[@]}"
do curl -X DELETE "$url$i" -H "Content-Type: application/json"
done
Это, вероятно, все еще не совсем сработает, пока вы не получите правильную авторизацию, так что ...
declare -a stdArgs=( -H "Content-Type: application/json" -H "$token" )
for i in "${id[@]}"
do curl -X DELETE "$url$i" "${stdAtrgs[@]}"
done
Посмотрите, будет ли это лучше.