Cómo eliminar el último carácter de un grep bash salida

COMPANY_NAME=`cat file.txt | grep "company_name" | cut -d '=' -f 2` 

salidas de algo como esto

"Abc Inc";

Lo que quiero hacer es que quiero quitar el final «;» así. ¿Cómo puedo hacer eso? Soy un principiante de bash. Cualquier idea o sugerencia sería útil.

  • Mismo aquí. cat/grep = grep.
  • Para el problema en cuestión, podría haber sido resolver con sólo grep: COMPANY_NAME=$(grep -Po ‘(?<=company_name=)»[^»]*»‘ file.txt)
InformationsquelleAutor liv2hak | 2011-02-22

14 Kommentare

  1. 49

    Yo uso la sed 's/;$//'. por ejemplo:

    COMPANY_NAME=`cat file.txt | grep "company_name" | cut -d '=' -f 2 | sed 's/;$//'`
    • No abuse de cats. grep en realidad se puede leer los archivos, ¿sabes? 😉
    • Sí, sé que hay al menos dos maneras de evitar cat aquí. Me dejó en el gato con el fin de evitar el cambio de la línea de comandos de la cuestión más allá de lo que era realmente necesario para hacer que funcione.
    • En realidad no en todos los casos, simplemente grep sin cat -v ocultar invisible (por ejemplo, malicioso) caracteres, unix.stackexchange.com/questions/202198/…
  2. 60

    Esto borrará el último carácter contenida en su COMPANY_NAME var independientemente de si es o no un punto y coma:

    echo "$COMPANY_NAME" | rev | cut -c 2- | rev
  3. 42
    foo="hello world"
    echo ${foo%?}
    hello worl
    • ESTE es el bash forma, no en el otro hilo de artilugios.
    • Me gusta. Añadir ? para obtener más caracteres que ser eliminado.
    • Esto sólo hizo que mi día porque yo estaba tratando de hacer un rápido y sucio lista de páginas web que había TLS claves para. for L in `ls *key` ; do echo ${L%.key} ; done
  4. 23

    Yo uso la head --bytes -1, o head -c-1 para el corto.

    COMPANY_NAME=`cat file.txt | grep "company_name" | cut -d '=' -f 2 | head --bytes -1`

    head salidas sólo el principio de una secuencia o archivo. Normalmente se cuenta con líneas, pero puede ser hecho para el recuento de caracteres o bytes en lugar. head --bytes 10 de salida será de los primeros diez caracteres, pero head --bytes -10 de salida será de todo, excepto la última de diez.

    NOTA: usted puede tener problemas si el último carácter es multi-byte, pero un semi-colon no

    Me gustaría recomendar esta solución a través de sed o cut porque

    • Es exactamente lo que head fue diseñado para hacer, por tanto, menos opciones de línea de comandos y un fácil-a-lea comando
    • Que te ahorra tener que pensar acerca de las expresiones regulares, que son frescas/poderoso, pero a menudo excesivo
    • Salva a su equipo tener que pensar acerca de las expresiones regulares, por lo que será imperceptiblemente más rápido
    • He probado la otra propuesta de solución y esta parece la mejor (y tan simple!) para mi caso de uso. Gracias!
    • en OSX brew install coreutils a continuación, puede utilizar ghead -c-1
  5. 11

    Creo que la forma más limpia para la tira de un solo carácter de una cadena con bash es:

    echo ${COMPANY_NAME:: -1}

    pero no he sido capaz de integrar el grep pieza dentro de las llaves, por lo que su tarea se convierte en un dos-forro:

    COMPANY_NAME=$(grep "company_name" file.txt); COMPANY_NAME=${COMPANY_NAME:: -1} 

    Esto eliminará cualquier carácter, punto y coma o no, pero puede deshacerse de el punto y coma específicamente, demasiado.
    Para eliminar TODOS los signos de punto y coma, siempre se puede caer:

    echo ${COMPANY_NAME/;/}

    Para eliminar sólo un punto y coma al final:

    echo ${COMPANY_NAME%;}

    O, para eliminar varios caracteres de punto y coma del final:

    echo ${COMPANY_NAME%%;}

    De gran detalle y más en este enfoque, El Proyecto de Documentación de Linux cubre mucho terreno en http://tldp.org/LDP/abs/html/string-manipulation.html

  6. 8

    Utilizando sed, si usted no sabe lo que el último carácter en realidad es:

    $ grep company_name file.txt | cut -d '=' -f2 | sed 's/.$//'
    "Abc Inc"
    • Yo no creo que usted necesita el \{1\} desde . significa un único carácter.
  7. 5

    No abuso cats. ¿Sabía usted que grep puede leer archivos, también?

    El enfoque canónico sería este:

    grep "company_name" file.txt | cut -d '=' -f 2 | sed -e 's/;$//'

    el enfoque más inteligente sería utilizar una sola perl o awk declaración, que puede hacer de filtro y las diferentes transformaciones a la vez. Por ejemplo algo como esto:

    COMPANY_NAME=$( perl -ne '/company_name=(.*);/&& print $1' file.txt )
  8. 3

    no tienen a la cadena de tantas herramientas. Sólo un comando awk hace el trabajo

     COMPANY_NAME=$(awk -F"=" '/company_name/{gsub(/;$/,"",$2) ;print $2}' file.txt)
  9. 1

    Suponiendo que las comillas son en realidad parte de la salida, no podía usted sólo tiene que utilizar el modificador-o a devolver todo lo que está entre comillas?

    COMPANY_NAME="\"ABC Inc\";" | echo $COMPANY_NAME | grep -o "\"*.*\""
  10. 1

    Algunas mejoras a la respuesta anterior. Para eliminar más de un char agregar varios signos de interrogación. Por ejemplo, para quitar los dos últimos caracteres de la variable $SRC_IP_MSG, se puede utilizar:

    SRC_IP_MSG=${SRC_IP_MSG%??}
  11. 0
    cat file.txt | grep "company_name" | cut -d '=' -f 2 | cut -d ';' -f 1
    • que era obvio!.lo siento, no pasa por alto que cosa obvia.
    • como linus torvalds dice, una de las cosas más difíciles de encontrar en un programador es «buen gusto», que es difícil de definir. pero desde que se beneficiarían de ella voy a hacerlo en este caso: a causa de la cat cada elemento de la tubería que hace el trabajo real que opera en su entrada estándar y su salida estándar. el beneficio es que usted puede reemplazar la cat con algún otro oleoducto que produce una salida similar a file.txt y usted no tiene que cambiar, incluso a un único carácter en la parte funcional de la tubería. esto permite que la caída en el oleoducto de reutilización.
    • fyb arriba (se olvidó de la etiqueta, así como alguien puede olvidarse de quitar el argumento de entrada a la hora de componer las tuberías y se preguntan por qué el resultado no es como se esperaba)
    • mientras yo no veo esto como que me da un «pedazo de su mente» (I lol iba por el camino) es bastante extremas reutilización para preservar el uso de cat sólo para dar la posibilidad de cambiar a algo más tarde. Lo único que pude ver es que vale la pena es la simplicidad. Si un usuario escribe grep pattern file, entonces estoy muy muy seguro de que él entiende que es esa primera parte que lee el archivo y donde empieza la tubería de ella.
    • gracias por tomar de manera positiva. es razonable decir grep foo file | grep bar | wc y es razonable decir cat file | grep foo | grep bar | wc. lo que no es razonable es dar inútil gato premios para el segundo. hay varios puntos a preseve en mi tesis sobre el tema. tal vez usted podría no apreciar ahora como no lo hizo cuando yo no tenía experiencia. me puse furioso no a usted, sino a la gente que debe saber mejor que iniciar y apoyar la práctica. espero que tenga sentido.
    • mi respuesta ahora es el aceptado; por supuesto que es sólo la opinión de una persona distinta a mí. gracias por la motivación para escribirlo.
    • bueno, es mucho mejor que el OP originalmente aceptado. La discusión no es también muy útil y aclara el punto que estaba tratando de hacer muy bien. He subido tu respuesta también. Además, no es igual que yo era la que tenía la motivación para ir a escribir una respuesta que todos podemos estar orgullosos. Así que todo: me alegro de que usted se irritó. Incluso si no a mí.
    • gracias! 🙂 parece que están aprendiendo unix cosas con un ojo en el rigor. ese es el enfoque correcto, así que te deseo buena suerte! ps: debo ofrecer mis disculpas por adelantado en caso de que yo estoy equivocado y usted es un unix veterano que solo busca llenar un par de lagunas en los conocimientos. LOL!
    • muy lejos de eso.

  12. 0

    No estoy encontrando que sed 's/;$//' obras. No recortar nada, aunque yo me pregunto si es porque el personaje que estoy tratando de recortar pasa a ser un «$». Lo que funciona para mí es sed 's/.\{1\}$//'.

  13. 0

    que usted puede quitar los comienzos y finales de una cadena de N caracteres usando esta bash construir, como alguien dijo ya

    $ fred=abcdefg.rpm
    $ echo ${fred:1:-4}
    bcdefg

    Sin EMBARGO, este no es compatible con versiones anteriores de bash.. como he descubierto ahora escribiendo un guión para un Red hat EL6 proceso de instalación. Esta es la única razón para publicar aquí.
    Un hacky manera de lograr esto es utilizar la sed con la ampliación de las regex como este:

    $ fred=abcdefg.rpm
    $ echo $fred | sed -re 's/^.(.*)....$/\1/g'
    bcdefg

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea