Respuestas:
Un ejemplo podría haber sido útil, pero si te entendiera correctamente, esto funcionaría:
echo "Hello: world" | cut -f1 -d":"
Esto convertirá "hola: mundo" en "hola".
basename
y cut
, vea la respuesta de Dennis a continuación
cut
puede leer desde stdin, por lo que es mejor especialmente cuando tiene una cadena muy larga que necesita procesar, como el contenido de un archivo.
hello: world
? Esta es la mitad de una respuesta.
En Bash (y ksh, zsh, dash, etc.), puede usar la expansión de parámetros con la %
que eliminará caracteres del final de la cadena o #
que eliminará caracteres del principio de la cadena. Si usa uno solo de esos caracteres, se eliminará la cadena coincidente más pequeña. Si dobla el personaje, se eliminará el más largo.
$ a='hello:world'
$ b=${a%:*}
$ echo "$b"
hello
$ a='hello:world:of:tomorrow'
$ echo "${a%:*}"
hello:world:of
$ echo "${a%%:*}"
hello
$ echo "${a#*:}"
world:of:tomorrow
$ echo "${a##*:}"
tomorrow
hello:world
que se hello:wo
use una cadena específica como ${a%:*}
?
"${a##*:}"
para obtener solo tomorrow
=)
a='hello:world:of:tomorrow'; pattern=''^([^:]*:).*$'
; [[$ a = ~ $ patrón]]; echo "$ {BASH_REMATCH [1]}" `. Eso coincide solo si hay dos puntos. Si desea que eso sea opcional, se tendría que usar un patrón diferente. Una explicación de las expresiones regulares de Bash (y las expresiones regulares en general) está más allá del alcance de estos comentarios. Puede encontrar otras preguntas que analicen esto o publique las suyas.
egrep -o '^[^:]*:'
egrep
es grep con -E
. No hace diferencia aquí de regular grep
. -o
indica a grep que imprima solo la parte de la línea que coincide con la expresión. ^
ancla el partido al inicio de una línea. [^:]*
coincide con cero o más caracteres que no son el :
carácter. :
coincide con el carácter :
.
Digamos que tiene una ruta con un archivo en este formato:
/dirA/dirB/dirC/filename.file
Ahora solo desea la ruta que incluye cuatro "/". Tipo
$ echo "/dirA/dirB/dirC/filename.file" | cut -f1-4 -d"/"
y tu salida será
/dirA/dirB/dirC
La ventaja de usar cut es que también puede cortar el directorio superior así como el archivo (en este ejemplo), así que si escribe
$ echo "/dirA/dirB/dirC/filename.file" | cut -f1-3 -d"/"
su salida sería
/dirA/dirB
Aunque puede hacer lo mismo desde el otro lado de la cadena, en este caso no tendría tanto sentido como escribir
$ echo "/dirA/dirB/dirC/filename.file" | cut -f2-4 -d"/"
resultados en
dirA/dirB/dirC
En algunos otros casos, el último caso también podría ser útil. Tenga en cuenta que no hay "/" al comienzo de la última salida.
recortar todo después de la última instancia de ":"
cat fileListingPathsAndFiles.txt | grep -o '^.*:'
y si quisieras soltar ese último ":"
cat file.txt | grep -o '^.*:' | sed 's/:$//'
@ kp123: desea reemplazar :
con /
(donde debería estar el colon de sed \/
)
cut
funciona, pero la respuesta de Dennis es mejor y más flexible. ¿Alguien sabe si genera un nuevo proceso comocut
?