2012-02-16 19 views
11

estoy buscado durante mucho tiempo cómo hacer una manipulación simple cadena en UNIXcadena de carbón en el índice X

tengo esta cadena:

theStr='...............' 

Y necesito cambiar el quinto Char a A, ¿cómo se puede hacer?

En C# Está hecho como éste theStr[4] = 'A'; // Zero based index.

Respuesta

27

Usted puede lograr esto con sed, el editor de línea de corriente:

echo $theStr | sed s/./A/5

Primero canalizar la salida de $ theStr al SED, que sustituye al quinto personaje con A.

+0

+1. De hecho sed es la herramienta correcta. En una nota lateral, esta versión particular solo funcionará si la cadena de entrada consiste en '.' – CodeExpress

+2

No, en realidad, el '.' no representa el" punto "del personaje, pero coincide con todos los caracteres. Si quisiera hacer coincidir el punto, escribiría '\ .' – jurgemaister

+0

ja, no me di cuenta de eso cuando escribí eso. ¡Esto es perfecto! – CodeExpress

3

No sé si es elegante, o la versión de fiesta que necesita, pero

theStr="${theStr:0:4}A${theStr:5}" 

La primera parte devuelve cuatro primeros caracteres, entonces el el carácter 'a', y entonces todos los caracteres que comienzan con el sexto uno

9
a="............" 
b="${a:0:4}A${a:5}" 
echo ${b} 

Aquí es una muy buena tutorial en st manipulación del anillo

0
[email protected]:~$ echo 'replace A please' | sed 's/^\(.\{8\}\).\(.*\)/\1B\2/' 
replace B please 

El comando sed anterior reemplaza el 8vo carácter sin importar qué es, por lo tanto, no tiene que especificar qué ch un personaje debe ser reemplazado.

En el código anterior sólo hay que reemplazar

  • 8 con la posición del carácter que desea
  • B con el carácter de lo que desea reemplazar con!

Así que para su ejemplo específico que se convierte en:

[email protected]:~$ echo '...............' | sed 's/^\(.\{4\}\).\(.*\)/\1A\2/' 
....A.......... 

no hablar de que puede reemplazar A con una cadena, proporcionando la cadena en lugar de B o simplemente borrar A al no proporcionar cualquier cosa que B es (\1\2)