有很多方法可以做到这一点。如果您想稍后自定义内容,使用函数采用多命令方法可能会给您更大的灵活性,例如:
#!/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 ''请在命令开头删除。