Cum să filtrați datele din fluxul stdout în Bash?

Iată cum arată rezultatul, în principiu:

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

Trebuie să obțin numele fișierelor din a doua coloană și să le trimit la rm . Există un script AWK care merge ca și awk '{print $ 2}' , dar mă întrebam dacă există o altă soluție.

2
Ca o curiozitate, grep -o '[] [^] * $' va păstra un spațiu înaintea fiecărui nume de fișier, dar dacă aveți nume de fișiere fără spații, rm .
adăugat autor tripleee, sursa

5 răspunsuri

Dacă aveți spații între ? și numele fișierului atunci:

cut -c9-

Dacă sunt tab-uri atunci:

cut -f2
3
adăugat

Plasat ieșirea în fișier

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

Editați-o cu sed

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

Sed aici este de potrivire a 2 părți de linie -

  1. ? cu file sau spații
  2. Alte caractere până la capătul liniei

Și apoi se schimbă întreaga linie numai cu a doua parte.

1
adăugat

utilizați în schimb tăiat/perl

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

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

bash only solution, assuming your output comes from stdin:

while read line; do echo ${line##* }; done
0
adăugat
... și presupunând că nu aveți nume de fișiere cu spații. Pentru a activa doar primul caracter, încercați $ {line #?} . (Asta e wildcard-ul, nu un semn de întrebare literal; adaugă o retrospectivă în față pentru a elimina numai semnele de întrebare.)
adăugat autor tripleee, sursa

Acest lucru poate funcționa pentru dvs.:

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

sau folosind GNU sed

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