Tengo un archivo de configuración que indica 1,2,3 que significa colocar un , después del 1er, 2do y 3er byte .
Por ejemplo, mi entrada es
stackoverflowentonces quiero hacerlo
s,t,a,ckoverflow ¿Cómo debo hacerlo con las herramientas de Linux? Siento que se debe usar sed , pero no sé cómo hacerlo.
Editar:
Tengo más de 10 comas para colocar. Y la línea también incluye caracteres de varios bytes.
En sed :
echo stackoverflow | sed 's/./&,/1;s/./&,/3;s/./&,/5' s/.../.../n reemplaza la n -ésima coincidencia. Después del primer reemplazo, el segundo byte sería ahora la tercera coincidencia y, después de eso, el tercer byte sería ahora el quinto.
O, con grupos de expresiones regulares:
echo stackoverflow | sed 's/\(.\)\(.\)\(.\)/\1,\2,\3,/' En expresiones regulares básicas (BRE), \(…\) se usa para agrupar expresiones. Puede hacer referencia al texto que coincidió con el n -ésimo grupo usando \ n , para reutilizar el texto coincidente en el reemplazo, por ejemplo. Entonces, en este caso, tengo tres grupos, cada uno con solo . .
Con GNU sed, puede evitar el \ usando expresiones regulares extendidas (ERE):
echo stackoverflow | sed -r 's/(.)(.)(.)/\1,\2,\3,/'Con juegos de caracteres multibyte, intente con la configuración regional C:
$ echo 'æ ' | LC_ALL=C sed 's/\(.\)\(.\)\(.\)/\1,\2,\3,/' �,�, , $ echo → | LC_ALL=C sed 's/\(.\)\(.\)\(.\)/\1,\2,\3,/' �,�,�,IFS=, read -ra arr <<< "$1" rules=() for i in "${arr[@]}"; do rules[$i]=1 done s=stackoverflow for (( i=0; i<${#s}; i++ )); do if (( ${rules[i+1]} )); then printf '%s,' "${s:i:1}" else printf '%s' "${s:i:1}" fi doneEjemplo de uso:
$ ./sof 1,2,3 $ s,t,a,ckoverflow $ ./sof 1,2,3,7 $ s,t,a,ckov,erflowEsto podría funcionar para usted (GNU sed):
sed 's/\B/\n/g;s/\n//4g;s/\n/,/g' fileo:
sed 's/\B/,/;s/\B/,/;s/\B/,/' file