Tengo un comando, por ejemplo: echo "word1 word2"
. Quiero poner una tubería ( |
) y obtener word1 del comando.
echo "word1 word2" | ....
No sé qué poner después de la tubería.
Awk es una buena opción si tienes que lidiar con espacios en blanco finales porque se encargará de ti:
echo " word1 word2 " | awk '{print $1;}' # Prints "word1"
Sin embargo, Cut no se ocupará de esto:
echo " word1 word2 " | cut -f 1 -d " " # Prints nothing/whitespace
'cortar' aquí no imprime nada / espacio en blanco, porque lo primero antes de un espacio era otro espacio.
-F","
para anular el separador de campo predeterminado (un espacio) con una coma.No es necesario utilizar comandos externos. Bash en sí mismo puede hacer el trabajo. Suponiendo "word1 word2" que obtuvo de algún lugar y se almacenó en una variable, por ejemplo
ahora puede asignar $ 1, o $ 2, etc. a otra variable si lo desea.
fuente
stdin
. @Matt M.--
significastdin
, por lo que$string
se pasa comostdin
.stdin
está separada por un espacio en blanco en argumentos$1
,$2
,$3
, etc. - al igual que cuando un Bash Evalúa programa argumentos (por ejemplo, comprobación$1
,$2
etc.), este enfoque se aprovecha de la tendencia de la cáscara para dividir elstdin
en argumentos de forma automática, eliminando la necesidad deawk
ocut
.set
establece los argumentos del shell.word1=$(IFS=" " ; set -- $string ; echo $1)
Configure IFS para reconocer correctamente el espacio entre las palabras. Envuelva entre paréntesis para evitar golpear el contenido original de $ 1.string="*"
. Sorpresa.Creo que una forma eficiente es el uso de matrices bash:
Además, puede leer directamente matrices en una tubería:
fuente
echo " word1 word2 " | { read -a array ; echo ${array[0]} ; }
string="*"
. Sorpresa.while
sintaxis para recuperar cada primera palabra en cada línea. De lo contrario, utilice el enfoque Boontawee Home. Además, tenga en cuenta queecho "${array[0]}"
se ha citado para evitar la expansión como lo notó gniourf-gniourf.Esto tiene la ventaja de que no utiliza comandos externos y deja intactas las variables $ 1, $ 2, etc.
fuente
$1, $2, …
intactas es una característica extremadamente útil para escribir guiones!Si está seguro de que no hay espacios iniciales, puede usar la sustitución de parámetros bash:
Cuidado con escapar del espacio único. Vea aquí para más ejemplos de patrones de sustitución. Si tiene bash> 3.0, también puede usar la coincidencia de expresiones regulares para hacer frente a los espacios iniciales: consulte aquí :
fuente
Podrías probar awk
Con awk es realmente fácil elegir cualquier palabra que desee ($ 1, $ 2, ...)
fuente
Usar la expansión de parámetros de shell
%% *
Aquí hay otra solución que usa la expansión de parámetros de shell . Se ocupa de múltiples espacios después de la primera palabra. El manejo de espacios delante de la primera palabra requiere una expansión adicional.
Explicación
Las
%%
significa borrar la coincidencia más larga de*
(un espacio seguido de cualquier número de cualesquiera otros caracteres) en el arrastre parte destring
.fuente
Me preguntaba cómo se midieron varias de las mejores respuestas en términos de velocidad. Probé lo siguiente:
1 @ mattbh
2 @ ghostdog74's
3 @ boontawee-home's
y 4 @ boontawee-home's
Los medí con el timeit de Python en un script Bash en un terminal Zsh en macOS, usando una cadena de prueba con 215 palabras de 5 letras. Hizo cada medición cinco veces (los resultados fueron todos para 100 bucles, el mejor de 3), y promediaron los resultados:
Buen trabajo, votantes 👏 ¡Los votos (a partir de este escrito) coinciden con la velocidad de las soluciones!
fuente
read -a
no es válido en el tablero).cortar corta el primer campo (-f 1) de una lista de campos delimitados por la cadena "" (-d "")
fuente
read
es tu amigo:Si la cadena está en una variable:
Si está trabajando en una tubería: primer caso: solo desea la primera palabra de la primera línea:
segundo caso: desea la primera palabra de cada línea:
Estos funcionan si hay espacios principales:
fuente
Como perl incorpora la funcionalidad de awk, esto también se puede resolver con perl:
fuente
Estaba trabajando con un dispositivo incrustado que no tenía ni perl, awk ni python y lo hizo con sed en su lugar. Admite múltiples espacios antes de la primera palabra (que las soluciones
cut
ybash
no manejaron).Esto fue muy útil al buscar
ps
identificadores de proceso ya que las otras soluciones aquí que usan solo bash no pudieron eliminar los primeros espacios que seps
usan para alinear.fuente