Hoe te filteren van gegevens uit de getabuleerde stdout-stream in Bash?

Dit is hoe de uitvoer eruit ziet, eigenlijk:

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

Ik moet de bestandsnamen ophalen uit de tweede kolom en deze doorgeven aan rm . Er is een AWK-script dat gaat als awk '{print $ 2}' maar ik vroeg me af of er een andere oplossing is.

2
Als een curiosum zal grep -o '[] [^] * $' één spatie bevatten voor elke bestandsnaam, maar als je bestandsnamen zonder spaties hebt, kan dat acceptabel zijn voor het doorgeven aan rm .
toegevoegd de auteur tripleee, de bron

5 antwoord

Als u spaties heeft tussen de ? en de bestandsnaam, dan:

cut -c9-

Als het tabbladen zijn, dan:

cut -f2
3
toegevoegd

Heeft uw uitvoer in een bestand geplaatst

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

Bewerk het met sed

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

Sed in hier komt overeen met 2 delen lijn -

  1. ? met tabs of spaties
  2. Andere tekens tot het einde f van de regel

En dan verandert het hele regel alleen met het tweede deel.

1
toegevoegd

gebruik in plaats daarvan knippen/perl

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

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

bash only solution, assuming your output comes from stdin:

while read line; do echo ${line##* }; done
0
toegevoegd
... en ervan uitgaande dat u geen bestandsnamen met spaties hebt. Gebruik $ {line #?} om alleen het eerste teken te zappen. (Dat is een jokerteken, geen letterlijk vraagteken, voeg een backslash vooraan toe om alleen vraagtekens te verwijderen.)
toegevoegd de auteur tripleee, de bron

Dit kan voor u werken:

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

of met behulp van GNU sed

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