¿Cómo puedo quitar los primeros X caracteres de la cadena usando sed?

126

Estoy escribiendo un script de shell para Linux incrustado en una pequeña caja industrial. Tengo una variable que contiene el texto pid: 1234y 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?

Kokesh
fuente
10
Si ${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 usando sh(como dash) o posiblemente zsh.
Pausado hasta nuevo aviso.

Respuestas:

0

Esto también hará el trabajo:

echo "$pid"|awk '{print $2}'
Arnaud F.
fuente
27
Esta pregunta es el primer hit para "omitir los primeros N caracteres en la cadena". No respondiste la pregunta.
jww
Esto no parece funcionar, y si lo hace, ¿puede explicar cómo?
Alexander Mills el
Funciona en mi sistema. Puede haber un problema con su separador de campo, intente awk -F": " '{print $2}'. Aún así, no es mi solución favorita.
mzuther
197

Lo siguiente debería funcionar:

var="pid: 1234"
var=${var:5}

¿Estás seguro de bashque el shell está ejecutando tu script?

Incluso el compatible con POSIX

var=${var#?????}

Sería preferible utilizar un proceso externo, aunque esto requiere que codifique los 5 en forma de un patrón de longitud fija.

chepner
fuente
1
También puede especificar la longitud con un segundo parámetro: ${var:5:2}comenzará en 1y regresará 12.
Max Candocia
108

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.

echo "$pid" | cut -c 5-
Randy the Dev
fuente
2
¡Esta es la solución más simple!
Brandon
2
Técnicamente, el OP solicitó sed, pero creo que esta es la mejor solución para "¿Cómo puedo quitar los primeros caracteres X de la cadena [en un terminal / bash]"? Cuando se usa en combinación con git, es bueno:git log --pretty=oneline | cut -c 42- | head
marksiemers
1
+1 Solución simple y útil. Cuando tenía la URL como http: // <ejemplo.com> y para cortar el protocolo 'http: //' tengo que decir como 8 caracteres en lugar de 7. No sé , pero así fue como me funcionó.
Santosh Kumar Arjunan
1
Santosh Kumar Arjunan: eso se debe a que el ejemplo "echo" $ pid "| cut -c 4-" en realidad no está cortando los primeros 4 caracteres, sino que extrae la subcadena a partir del cuarto carácter. Por lo tanto, en realidad corta los primeros 3 caracteres. Por lo tanto, si desea cortar 7 primeros caracteres, desea extraer todo del octavo carácter y, de hecho, hacer "cortar -c 8-"
al-ash
1
@DeanHiller 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.
JustCarty
46

Use la -ropción ("usar expresiones regulares extendidas en el script") sedpara usar la {n}sintaxis:

$ echo 'pid: 1234'| sed -r 's/^.{5}//'
1234
Mark Longair
fuente
1
¿Cómo sería para el caso, si quisiera quitar los últimos X caracteres de una cadena?
Kokesh
55
@Kokesh: puedes sed -r 's/.{5}$//'quitar los últimos 5 caracteres
Mark Longair
77
Puede hacerlo sin el -r( -Een OS X, IIRC) si escapa de las llaves (sin embargo, no sé si eso funciona en OS X).
Pausado hasta nuevo aviso.
2
@Dennis: Acabo de comprobar - escapar de las llaves (y dejando fuera -r/ -E) funciona en OS X.
Gordon Davisson
15

Corta los dos primeros caracteres de la cadena:

$ string="1234567890"; echo "${string:2}"
34567890
dtp70
fuente
@ dtp70 Muchas gracias por una respuesta genérica, ¡funcionó muy bien!
wolfram77
10

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:

$ echo abcde| awk '{print substr($0,2)}'
bcde
$
Ben
fuente
8

Lo más probable es que también lo tengas cut. Si es así:

[me@home]$ echo "pid: 1234" | cut -d" " -f2
1234
Shawn Chin
fuente
1
El problema cutes que no maneja las secuencias de espacios en blanco con sensatez, el uso tr -s ' 'para "exprimir" espacios hace que se comporte mejor.
Thor
1
No está destinado a ser una herramienta de baile y canto; es simple y hace lo que dice en la lata y está ampliamente disponible. Debería funcionar bien para dichos requisitos, y ciertamente es más robusto que recortar caracteres fijos de posiciones específicas.
Shawn Chin
5

Bueno, ha habido soluciones aquí con sed, awk, cuty el uso de bashla sintaxis. Solo quiero agregar otra variante de conformidad POSIX:

$ echo "pid: 1234" | tail -c +6
1234

-cle 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.

Mecki
fuente
4

Otra forma, usando en cutlugar de sed.

result=`echo $pid | cut -c 5-`
Evgeny
fuente
Quiere eliminar los primeros 4 caracteres. Esto obtiene los primeros 4 caracteres.
MM.
2

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:

result=\`echo "$pid" | sed '/./ { s/pid:\ //g; }'\``

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:

# Uncomment a line (edit the file in-place):
sed -i '/#\ COMMENTED_LINE_TO_MATCH/ { s/#\ //g; }' /path/to/target/file

El -isiguiente sedes 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).

cabeza de árbol
fuente
1

En lugar de eliminar n caracteres desde el principio, tal vez podría extraer los dígitos directamente. Al igual que...

$ echo "pid: 1234" | grep -Po "\d+"

Esta puede ser una solución más robusta y parece más intuitiva.

usuario1751825
fuente