Estoy escribiendo un script de shell para Linux incrustado en una pequeña caja industrial. Tengo una variable que contiene el texto pid: 1234
y quiero quitar los primeros X caracteres de la línea, por lo que solo queda 1234. Tengo más variables que necesito "limpiar", así que necesito cortar X primeros caracteres y ${string:5}
no funciona por alguna razón en mi sistema.
Lo único que parece tener la caja es sed
.
Estoy tratando de hacer que lo siguiente funcione:
result=$(echo "$pid" | sed 's/^.\{4\}//g')
¿Algunas ideas?
${string:5}
no funciona, no está utilizando Bash u otro shell que admita esa sintaxis. ¿Qué shell y versión estás usando? ¿Cómo se ve tu shebang? Supongo que estás usandosh
(comodash
) o posiblementezsh
.Respuestas:
Esto también hará el trabajo:
fuente
awk -F": " '{print $2}'
. Aún así, no es mi solución favorita.Lo siguiente debería funcionar:
¿Estás seguro de
bash
que el shell está ejecutando tu script?Incluso el compatible con POSIX
Sería preferible utilizar un proceso externo, aunque esto requiere que codifique los 5 en forma de un patrón de longitud fija.
fuente
${var:5:2}
comenzará en1
y regresará12
.Aquí hay un método conciso para cortar los primeros X caracteres usando
cut(1)
. Este ejemplo elimina los primeros 4 caracteres cortando una subcadena que comienza con el quinto carácter.fuente
git log --pretty=oneline | cut -c 42- | head
cut -c ${LEN}-
. Las llaves se utilizan para concatenar la cadena con caracteres variables válidos, para distinguir qué es la variable y qué no. Si desea obtener más información sobre esto, busque "concatenación de cadenas variables bash" para obtener más recursos sobre por qué / cómo funciona.Use la
-r
opción ("usar expresiones regulares extendidas en el script")sed
para usar la{n}
sintaxis:fuente
sed -r 's/.{5}$//'
quitar los últimos 5 caracteres-r
(-E
en OS X, IIRC) si escapa de las llaves (sin embargo, no sé si eso funciona en OS X).-r
/-E
) funciona en OS X.Corta los dos primeros caracteres de la cadena:
fuente
póngalo a través de
awk '{print substr($0,42)}'
donde 42 es uno más que el número de caracteres a soltar. Por ejemplo:fuente
Lo más probable es que también lo tengas
cut
. Si es así:fuente
cut
es que no maneja las secuencias de espacios en blanco con sensatez, el usotr -s ' '
para "exprimir" espacios hace que se comporte mejor.Bueno, ha habido soluciones aquí con
sed
,awk
,cut
y el uso debash
la sintaxis. Solo quiero agregar otra variante de conformidad POSIX:-c
le dice a la cola en qué byte offset comenzar, contando desde el final de los datos de entrada, pero si el número comienza con un+
signo, es desde el principio de los datos de entrada hasta el final.fuente
Otra forma, usando en
cut
lugar desed
.fuente
Encontré la respuesta en sed puro suministrada por esta pregunta (ciertamente, publicada después de que esta pregunta fue publicada). Esto hace exactamente lo que pediste, únicamente en sed:
El punto
sed '/./
) es lo que quieras hacer coincidir. Su pregunta es exactamente lo que estaba tratando de hacer, excepto en mi caso que quería hacer coincidir una línea específica en un archivo y luego descomentarla. En mi caso fue:El
-i
siguientesed
es editar el archivo en su lugar (elimine este interruptor si desea probar su expresión coincidente antes de editar el archivo).(Publiqué esto porque quería hacer esto completamente con sed, ya que esta pregunta se hizo y ninguna de las respuestas anteriores resolvió ese problema).
fuente
En lugar de eliminar n caracteres desde el principio, tal vez podría extraer los dígitos directamente. Al igual que...
Esta puede ser una solución más robusta y parece más intuitiva.
fuente