Bashの表形式の標準出力ストリームからデータをフィルタリングする方法は?

基本的に出力は次のようになります。

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

2番目の列からファイル名を取得し、 rm に渡す必要があります。 awk '(print $ 2)' のようなAWKスクリプトがありますが、別の解決策があるのか​​どうか疑問に思っていました。

2
好奇心として、 grep -o '[] [^] * $' は各ファイル名の前にスペースを1つ入れますが、スペースなしのファイル名を持つ場合は、 rm 。
追加された 著者 tripleee,

5 答え

とファイル名の間にスペースがある場合は、次のようになります。

cut -c9-

それらがタブの場合:

cut -f2
3
追加された

出力をファイルに配置

$> 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

ここのSedは、

  1. ?タブまたはスペースで
  2. 行末までのその他の文字

そして、それは第二の部分とだけ全行を変更します。

1
追加された

代わりにcut/perlを使用する

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

|perl -ne '@cols = split /\t/; print $cols[1]'|xargs rm -rf
0
追加された

bash only solution, assuming your output comes from stdin:

while read line; do echo ${line##* }; done
0
追加された
あなたがスペースでファイル名を持っていないと仮定します。最初の文字だけを圧縮するには、 $ {line#?} を試してください。 (これはワイルドカードであり、文字通りの疑問符ではなく、バックスラッシュを前に付けて疑問符を取り除くだけです)。
追加された 著者 tripleee,

これはあなたのために働くかもしれません:

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

またはGNU sedを使用する

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