如何从Bash中的列表stdout流中过滤数据?

这是输出的样子,基本上:

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

我需要从第二列获取文件名并将它们传递给 rm 。 AWK脚本就像 awk'{print $ 2}',但我想知道是否还有其他解决方案。

2
作为一个好奇心, grep -o'[] [^] * $'将在每个文件名之前保留一个空格,但如果你的文件名没有空格,那么传递给是可以接受的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在这里匹配2部分线 -

  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
额外