Compression de compression

J'adore l'extension d'accolade (par exemple, rm file.{0..5} ). Je trouve cela beaucoup plus facile à lire que la version étendue. Y a-t-il un moyen rapide et facile de faire le contraire?

Par exemple, étant donné l'input www.example.com www1.example.com www2.example.com la sortie serait www{,1,2}.example.com .

La réponse courte est non, ce n'est pas possible mais cela semble lié au plus long problème de sous-string commun que vous pouvez considérer comme sharepoint départ si vous souhaitez le coder vous-même.

Trouver une belle expression en général est un problème difficile et mal défini (qu'est-ce que le beau sens signifie?). Si vous cherchez une seule expression d'accolade, c'est-à-dire que vous avez un set de strings et que vous voulez les exprimer sous la forme PREFIX{MIDDLE1,MIDDLE2,...,MIDDLEn}SUFFIX avec PREFIX et SUFFIXE maximum, alors le problème est bien défini et il existe un algorithm simple:

  1. Trouvez le plus long préfixe commun.
  2. Trouvez le plus long suffixe commun.
  3. Diviser les strings.

Je réutiliserai ma fonction longest_common_prefix .

 longest_common_prefix () { prefix= ## Truncate the two ssortingngs to the minimum of their lengths if [[ ${#1} -gt ${#2} ]]; then set -- "${1:0:${#2}}" "$2" else set -- "$1" "${2:0:${#1}}" fi ## Binary search for the first differing character, accumulating the common prefix while [[ ${#1} -gt 1 ]]; do n=$(((${#1}+1)/2)) if [[ ${1:0:$n} == ${2:0:$n} ]]; then prefix=$prefix${1:0:$n} set -- "${1:$n}" "${2:$n}" else set -- "${1:0:$n}" "${2:0:$n}" fi done ## Add the one remaining character, if common if [[ $1 = $2 ]]; then prefix=$prefix$1; fi } 

J'utilise rev pour le suffixe parce que je n'ai pas envie d'écrire la search de suffixe commune correspondante. Je suppose que les strings ne contiennent aucune nouvelle ligne.

 first=$1; shift prefix=$(rev <<<"$first") for x; do longest_common_prefix "$prefix" "$(rev <<<"$x")" done suffix=$(rev <<<"$prefix") first=${first%"$suffix"} prefix=$first for x; do longest_common_prefix "$prefix" "${x%"$suffix"}" done printf '%s{%s' "$prefix" "${first#"$prefix"}" for x; do x=${x%"$suffix"} printf ',%s' "${x#"$prefix"}" done 

Notez que si les strings peuvent contenir les caractères ,{} , vous devrez find une forme de citation.