Pedido inteligente del file Localized.strings

En mi Localizable.Strings trato de tener todos los pares en order alfabético. ¿Es posible reorderarlos por order alfabético de mis Localizable.strings ? Maby usando genstring o script bash especial?

Aquí tengo requisitos adicionales para completar:

1. El pedido debe ser insensible a mayúsculas y minúsculas.

2. Primero, las líneas X (por ejemplo, cinco) deben copyrse, no orderarse.

Este requisito debe cumplirse porque en el file Localized.strings tengo el autor, el nombre de la compañía y el nombre del producto como un comentario en la parte superior.

3. Guarde comentarios

Quiero mantener comentarios sobre las cadenas traducidas y mantener nuevas líneas entre cada traducción. Estos comentarios son generados por el command especial genstrings para desarrolladores de iOS (por ejemplo, find ./ -name "*.m" -print0 | xargs -0 genstrings -o en.lproj encontrar todos NSLocalizedString(@"Param",@"Comment") en mi código y generar pares /* Comment */ /r/n "Param" = "Param"; al file). La línea de comentario antes de la traducción es opcional y puede tener solo 1 línea. Por ejemplo file:

 /* This is Billy */ "Billy" = "The smartest guy in the univererse"; /* The Hitchhiker's Guide to the Galaxy */ "42" = "the answer to life the universe and everything"; "Johny" = "Johny"; /* Optional field */ "Anny" = "Anny"; 

El resultado debe ser:

 /* The Hitchhiker's Guide to the Galaxy */ "42" = "the answer to life the universe and everything"; /* Optional field */ "Anny" = "Anny"; /* This is Billy */ "Billy" = "The smartest guy in the univererse"; "Johny" = "Johny"; 

Esta pregunta es la variante más sofisticada de mi propia pregunta que puede encontrar aquí: Reorderar file .strings

Creo que esto es lo que quieres
En awk

 awk 'BEGIN{RS="";FS="\n"} {t=$NF} match(t,/^"([^"]+)/,a){ key[NR]=tolower(a[1])"\t"++x b[x]=$0 } END { asort(key) for (i=1; i<=x; i++) { split(key[i],a,"\t") print b[a[2]] "\n" } }' file 

salida

 /* The Hitchhiker's Guide to the Galaxy */ "42" = "the answer to life the universe and everything"; /* Optional field */ "Anny" = "Anny"; /* This is Billy */ "Billy" = "The smartest guy in the univererse"; "Johny" = "Johny"; 

EDITAR

Para omitir las 5 primeras líneas y seguir imprimiéndolas

 awk 'NR<6{print;next} NR==6{RS="";FS="\n"} {t=$NF} match(t,/^"([^"]+)/,a){ key[NR]=tolower(a[1])"\t"++x b[x]=$0 } END { asort(key) for (i=1; i<=x; i++) { split(key[i],a,"\t") print b[a[2]] "\n" } }' file 

EDIT 2

Creo que esto debería funcionar en Mac.

 awk 'NR<6{print;next} NR==6{RS="";FS="\n"} {t=$NF} split(t,a,"\""){ key[NR]=tolower(a[2])"\t"++x b[x]=$0 } END { asort(key) for (i=1; i<=x; i++) { split(key[i],a,"\t") print b[a[2]] "\n" } }' file 

Aquí hay otra forma.

 X=5; file=<file>; \ head -n $X $file && \ cat $file | sed '1,'$X'd' | \ sed 's/\([^;]\)$/\1@@@/g' | \ tr -d '\n' | \ tr ';' '\n' | \ sed 's/$/;/g' | \ awk -F "@@@" '{print $2"@@@"$1}' | \ sed 's/^@@@//g' | \ sort --ignore-case | \ awk -F "@@@" '{print $2"\n"$1"\n"}' | \ cat -s 

Explicado.

 X=5; file=<file>; \ # define variables head -n $X $file && \ # output first set of lines cat $file | sed '1,'$X'd' | \ # process rest of the lines sed 's/\([^;]\)$/\1@@@/g' | \ # append @@@ to lines not ending with semicolon tr -d '\n' | \ # remove all new lines and make a single line string tr ';' '\n' | \ # break single string into multiple lines at semicolons sed 's/$/;/g' | \ # add semicolons at the end of lines awk -F "@@@" '{print $2"@@@"$1}' | \ # swap comment and translation sed 's/^@@@//g' | \ # remove extra @@@ of translations without comments sort --ignore-case | \ # sort awk -F "@@@" '{print $2"\n"$1"\n"}' | \ # swap translation and comment, print with new lines cat -s # remove extra new lines