¿Cómo filtrar los datos de la secuencia de stdout tabulada en Bash?

Aquí es cómo se ve la salida, básicamente:

?       RESTRequestParamObj.cpp
?       plugins/dupfields2/_DupFields.cpp
?       plugins/dupfields2/_DupFields.h

Necesito obtener los nombres de archivo de la segunda columna y pasarlos a rm . Hay un script de AWK que va como awk '{print $ 2}' pero me preguntaba si habría otra solución.

2
Como curiosidad, grep -o '[] [^] * $' mantendrá un espacio antes de cada nombre de archivo, pero si tiene nombres de archivo sin espacios, eso podría ser aceptable para pasar a rm .
agregado el autor tripleee, fuente

5 Respuestas

Si tiene espacios entre ? y el nombre de archivo, entonces:

cut -c9-

Si son pestañas entonces:

cut -f2
3
agregado

Coloca tu salida en archivo

$> cat ./text 
?       RESTRequestParamObj.cpp
?       plugins/dupfields2/_DupFields.cpp
?       plugins/dupfields2/_DupFields.h

Edítalo con sed

$> cat ./text | sed -r -e 's/(\?[\ \t]*)(.*)/\2/g'
RESTRequestParamObj.cpp
plugins/dupfields2/_DupFields.cpp
plugins/dupfields2/_DupFields.h

Sed aquí está emparejando 2 partes de la línea -

  1. ? con pestañas o espacios
  2. Otros caracteres hasta el final de la línea

Y luego cambia la línea entera solo con la segunda parte.

1
agregado

usa cut/perl en su lugar

cut -f2 -t'\t'|xargs rm -rf

|perl -ne '@cols = split /\t/; print $cols[1]'|xargs rm -rf
0
agregado

bash only solution, assuming your output comes from stdin:

while read line; do echo ${line##* }; done
0
agregado
... y asumiendo que no tienes nombres de archivo con espacios. Para cambiar solo el primer carácter, intente $ {line #?} . (Eso es s comodín, no un signo de interrogación literal; agregue una barra invertida al frente para eliminar solo los signos de interrogación).
agregado el autor tripleee, fuente

Esto podría funcionar para usted:

 echo "?       RESTRequestParamObj.cpp" | sed -e 's/^\S\+/rm /' | sh

o utilizando GNU sed

 echo "?       RESTRequestParamObj.cpp"| sed -r 's/^\S+/rm /e'
0
agregado