Самый простой способ заменить каждое вхождение данного слова другим UUID в bash - PullRequest
0 голосов
/ 25 мая 2018

file.txt содержит несколько вхождений слова 'dummy', и цель состоит в том, чтобы заменить каждое вхождение такого слова новым UUID.

Мне было интересно, есть ли решение для этого с использованием одногоКоманду -line, но если нет, я бы хотел простейший сценарий bash.Например, что-то в соответствии с:

sed -i "s/dummy/$(uuidgen)/g" file.txt

к сожалению, эта команда заменяет каждое слово "пустышка" на тот же uuid.

например,

Ввод:

{
{"myid":"dummy"},
{"myid":"ymmud"},
{"myid":"dummy"},
{"myid":"ymmud"},
{"myid":"dummy"},
{"myid":"ymmud"}
}

ожидаемый результат:

{
{"myid":"79769E7B-BED5-4CB5-AEF9-CCE445D9212E"},
{"myid":"ymmud"},
{"myid":"F2FDDD4A-4800-4F0F-911A-FEDBC82915DD"},
{"myid":"ymmud"},
{"myid":"52D93565-81E9-479C-8BD9-457754581BBE"},
{"myid":"ymmud"}
}

1 Ответ

0 голосов
/ 25 мая 2018

Мне было интересно, есть ли решение для этого с помощью однострочной команды, но если нет, я бы хотел простейший сценарий bash

Вот возможное решение вашейпроблема:

Если ваш входной файл, например,

{
  {"myid":"dummy"},
  {"myid":"ymmud"},
  {"myid":"dummy"},
  {"myid":"ymmud"},
  {"myid":"dummy"},
  {"myid":"ymmud"}
}

, то следующий bash script

while IFS= read -r line; do
  echo $line | sed "s/dummy/`uuid`/g";
done < jsonfile

выведет

{
  {"myid":"a1c3874c-601d-11e8-97bd-705ab6b2eca7"},
  {"myid":"ymmud"},
  {"myid":"a1c45e56-601d-11e8-922c-705ab6b2eca7"},
  {"myid":"ymmud"},
  {"myid":"a1c57390-601d-11e8-aa47-705ab6b2eca7"},
  {"myid":"ymmud"}
}

Изначально в вашем вопросе говорилось о textfile, следовательно, об этом конкретном решении, которое игнорирует формат.Если вы хотите специально манипулировать JSON, я рекомендую, например.jq (apt-get install jq).

по новому UUID

Пространство клавиш UUID (в зависимости от типа UUID) огромно.Это очень маловероятно, чтобы вызвать коллизий при небольшом объеме данных.

...