Tengo una cadena que me gustaría manipular. La cadena es H08W2345678
¿cómo podría manipularla para que la salida sea justa W2345678
?
Del mismo modo, si quisiera eliminar los últimos 4 caracteres H08W2345678
para obtener H08W234
cómo hacerlo
bash
shell
text-processing
sed
3kstc
fuente
fuente
sed
?H08W2345678
y necesito manipularlo.W2345678
Este valor con otro dato se colocará en un correo electrónico enviado. El correo electrónico se realizará con cron.awk
it. Creo una matriz y luego modifico cada uno de los elementos dentro de la matriz (todo de manera diferente, es decir, cambio la marca de tiempo de Epoch en segundos a una fecha, etc.)printf %s\\n "XX,H08W2345678,YY" | awk -F, '{print substr($2, 4); print substr($2, 1, length($2)-4)}'
Respuestas:
Simplemente usando bash (o de
ksh93
dónde viene esa sintaxis ozsh
):Vea el wiki de Wooledge para más información sobre la manipulación de cuerdas .
fuente
"${string:0:${#string}-4}"
funciona en bash versión 4.1 siempre que la longitud$string
sea de al menos 4.abc-e
, donde, cuando sueltas los primeros tres caracteres, te quedan-e
(porqueecho -e
no hace lo que quieres).sed 's/^.\{3\}//'
encontrará los primeros tres caracteres^.\{3\}
y los reemplazará con espacios en blanco. Aquí^.
coincidirá con cualquier carácter al comienzo de la cadena (^
indica el inicio de la cadena) y\{3\}
coincidirá con el patrón anterior exactamente 3 veces. Entonces,^.\{3\}
coincidirá con los primeros tres caracteres.Del mismo modo,
sed 's/.\{4\}$//'
reemplazará los últimos cuatro caracteres con espacios en blanco ($
indica el final de la cadena).fuente
's/^.\{3\}//'
y's/.\{4\}$//'
como todavía estoy aprendiendo sed, muchas gracias...
en lugar de.\{3\}
desde (a mí) que es más fácil de leer:sed -e 's/^...//' -e 's/....$//'
o en una sola expresión con la alternancia:sed -r 's/^...|....$//g'
. Si hubiera más de unos pocos caracteres para eliminar, entonces usaría la/.\{17}\/
expresión en lugar de/.............../
.-e
o-n
. Por supuesto, el significado de “soltar los 4 últimos caracteres” no está definida para una cadena de menos de 4 caracteres, pero, si alguien quería adaptar esta a caer la primera o la última de un carácter, que podría explotar.Si tiene un archivo en el que cada línea es una cadena de once caracteres (o lo que sea) que desea cortar,
sed
es la herramienta que debe utilizar. Está bien para manipular una sola cadena, pero es exagerado. Para una sola cadena, la respuesta de Jason es probablemente la mejor, si tiene acceso a bash versión 4.2 o superior. Sin embargo, las sintaxis y parecen ser exclusivas de bash (bueno, bash, ksh93, mksh y zsh). No las veo en The Open Group Base Especificaciones para Shell Command Language . Si está atascado con un shell compatible con POSIX que no admite la expansión (extracción) de subcadenas, puede usar${parameter:offset}
${parameter:offset:length}
usando en
printf
lugar deecho
proteger contra cadenas comoabc-e
, donde, cuando sueltas los primeros tres caracteres, te quedan-e
(yecho -e
no haces lo que quieres).Y, si no está utilizando un shell de la familia Bourne (o si está utilizando un antiguo sistema anterior a POSIX), estos deberían funcionar:
El espacio inicial adicional es para evitar problemas con los valores
$string
que sonexpr
operadores reales (p. Ej+
./
,index
Umatch
) u opciones (p. Ej.--
,--help
O--version
).fuente
X
; por ejemplo,expr "X$string" : 'X...\(.*\)'
. OMI, eso es más fácil de leer y entender. ¿Hay algún problema con eso, o alguna razón para preferir un espacio? (3) Hoy aprendí queexpr + "$string" : '...\(.*\)'
ahora funciona. No recuerdo eso de hace 40 años; ¿se usa lo suficientemente ampliamente como para ser seguro recomendar? (4) Te perdiste una nota sobre la respuesta de jasonwryan y un error en la respuesta de heemayl.expr +
es solo GNU (no funcionará en Solaris ni FreeBSD AFAICS). Uso el espacio en lugar de x, ya que es menos probable que algunaexpr
implementación tenga operadores que comiencen con el espacio que conx
y también porque es menos probable que haya elementos de clasificación que comiencen con el espacio que conx
. Pero luego me doy cuenta de que probablemente no sea una buena opción para laexpr " $a" "<" " $b"
comparación de cadenas, ya que algunas implementaciones terminan haciendo una comparación numérica cuando$a
/$b
parecen números. Quizásexpr "@@$a"...
oexpr "x $a"
podría ser más seguro.Con:
Hacer coincidir 3 o 4 caracteres parece simple (para la mayoría de los shells):
Para los shells más antiguos (como el shell Bourne), use:
Si se necesita un recuento numérico de caracteres, use:
Por supuesto, esas expresiones regulares también funcionan con sed, awk y bash 3.0+:
fuente
fuente
cut
es mucho más elegante que cualquier otra cosa en esta página.