2017-11-03 112 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

這是一個很好的解釋,正是我所需要的,非常感謝! –