2011-11-12 27 views
2

下面是輸出的樣子,基本上是:如何從Bash中的表格化輸出流中過濾數據?

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

我需要從第二列中獲取文件名並傳遞給rm。有一個像awk '{print $2}'一樣的AWK腳本,但我想知道是否有另一種解決方案。

+0

作爲一種好奇心,'grep -o'[] [^] * $''將在每個文件名前保留一個空格,但是如果您的文件名不含空格,那麼傳遞給'rm' 。 – tripleee

回答

3

如果你有?,然後將文件名之間的空格:

cut -c9- 

如果他們的標籤,那麼:

cut -f2 
1

放置在您的輸出文件

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

編輯它與sed

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

桑達在這裏是匹配2份線 -

  1. ?用製表符或空格
  2. 其他字符,直到端f行

然後它改變了整條生產線只與第二部分。

0

這可能會爲你工作:

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

,或者使用GNU sed的

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

慶典唯一的解決方案,假設你的輸出是來自標準輸入:

while read line; do echo ${line##* }; done 
+0

...並假設您沒有帶空格的文件名。要刪除第一個字符,請嘗試'$ {line#?}'。 (這是通配符,不是字面問號;在前面添加反斜槓以僅刪除問號。) – tripleee

0

使用剪切/ perl代替

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

<your output>|perl -ne '@cols = split /\t/; print $cols[1]'|xargs rm -rf