Существует множество способов сделать это. Использование многокомпонентного подхода с использованием функции может дать вам большую гибкость, если вы захотите настроить вещи позже, например:
#!/bin/bash
checkdupes() {
files="$*"
for f in $files; do
filename="$f"
printf "Searching File: %s\n" "${filename}"
while read -r line; do
arr=( $(grep -n "${line}" "${filename}" | awk 'BEGIN { FS = ":" } ; {print $1" "}') )
for i in "${arr[@]:1}"; do
sed -i '' ''"${i}"'s/'"${line}"'/'"$(uuidgen)"'/g' "${filename}"
printf "Replaced UUID [%s] at line %s, first found on line %s\n" "${line}" "${i}" "${arr[0]}"
done
done< <( sort "${filename}" | uniq -d )
done
}
checkdupes /path/to/*.java
Итак, эта серия команд сначала сортирует дубликаты (если они есть) в любом выбранном вами файле. Он берет эти дубликаты и использует grep
и awk
для создания массива номеров строк, в котором найден каждый дубликат. Зацикливание массива (при пропуске первого значения) позволит заменить дубликаты новым UUID
, а затем повторно сохранить файл.
Использование файла дубликата списка :
Если вы хотите использовать файл со списком дубликатов для поиска в других файлах и заменить UUID
в каждом из них, которые соответствуют, это просто вопрос изменения двух строк:
Заменить:
for i in "${arr[@]:1}"; do
С:
for i in "${arr[@]}"; do
Заменить:
done< <( sort "${filename}" | uniq -d )
С:
done< <( cat /path/to/dupes_list )
ПРИМЕЧАНИЕ : если вы не хотите перезаписывать файл, удалите sed -i ''
в начале команды.