2017-11-03 109 views
0
x=rankings* && grep -A10 -P '^Ranked :$' $x | tail -n +2 > results$x 

这是一个命令,我无法使用该命令,无法在10次以上的堆栈溢出搜索中找到任何内容。使用通配符作为参数的Bash命令

有没有一种方法可以将通配符作为参数提供给一行命令?我想根据目录中的现有文件制作一个文件列表。

我得到的最接近是

x=rankingsX.Y.Z && grep -A10 -P '^Ranked :$' $x | tail -n +2 > results$x 

,其中XYZ是一些数字,但是这硬编码分别是我的目标相反 - 单行命令(不脚本文件),搜索和使用原始名称将特定文本输出到文件中。

+1

一般而言,要求一个“单行命令”是坏的形式因为它优先考虑简洁性而不是可读性。没有理由不可以在一行中写'for x排名*',在一个交互式shell中写一个循环的主体,在第三个''完成',这会让任何人试图追随你在做什么(包括你未来的自我!)更容易。 –

+0

感谢您的建议,我想我应该尝试使用shell的那部分 - 假设Konsole可以做这样的事情? –

+0

不需要特殊的终端支持 - 如果你编写复合命令的一部分(它本身没有语法上的完整性)并按回车,你会在下一行看到'>' - 这意味着shell给你一个添加更多/完成已经启动的语法的机会。如果你想分割一些*可能被解释为语法上有效的多行代码,那么在一行的末尾加一个反斜杠会让你在下一行输入更多。 –

回答

1

重定向一次只有一个目的地;因此,尝试重定向到一个表达式,该表达式在进行字符串拆分和全局展开时导致多个文件名会导致“错误重定向”错误。

想要的是x对于glob匹配的每个值,一次只有一个值 - 也就是说,这是一个for循环的作业。

for x in rankings*; do grep -A10 -P '^Ranked :$' "$x" | tail -n +2 >"results$x"; done 

...这也可以在(甚至在交互的shell)撰写了多条线路,如:

for x in rankings*; do 
    grep -A10 -P '^Ranked :$' "$x" | tail -n +2 >"results$x" 
done 
+0

这是一个很好的解释,正是我所需要的,非常感谢! –