2012-04-27 65 views
1

在bash中,我有以下的(典型值)的情況:如何引用之前輸出的特定行?

~/some/dir$ find | grep java 

其輸出,例如

./subdir1/subdir2/file1.java 
./subdir1/subdir3/file2.java 
./subdir1/subdir4/file3.java 
./subdir1/subdir2/file4.java 
./subdir1/subdir6/file5.java 

現在我知道file5.java,這是我一直在尋找(例如文件),是對子目錄,所以我執行:

vi subdir1/subdir6/file5.java 

但爲了做到這一點我必須要麼鍵入路徑(我知道,使用Tab鍵SPEE或者將路徑複製並粘貼到文件中

問題是:bash(或任何其他shell)上是否存在引用前一個命令輸出的行的快捷方式/變量,以便我可以說

vi [whatever the previous command returned on the 5th line] 

,這將是一個很好的節省時間

的感謝!

+1

將vi的$(找到| grep的的java |頭-5 |尾-1)太複雜? – 2012-04-27 17:44:08

+0

問題是,我無法知道之前,我執行找到哪一行是我想編輯的文件,所以它必須在兩個不同的命令 – AndresQ 2012-04-27 17:46:06

+0

相關:http://stackoverflow.com/questions/5955577/bash-automatically-capture-last-executed-command-into-a-variable – 2012-04-27 18:32:33

回答

2

使用bash的歷史,你可以接近[whatever the previous command returned on line 5]

下面是一個例子

$ find -name "*.java" 
src/file1.java 
... 
src/file5.java 
... 
$ vi $(!! | head -5 | tail -1) 

在這個例子中!!表示該命令再次執行SENCE [whatever the previous command returned]

以下命令 | head -5 | tail -1是一個比較尷尬的方式來表達[take line 5]從輸入

如果你是一個特定的文件名後,你還可指定搜索表達式

$ vi $(!find | grep file5) 

如果find需要很長時間才能執行,您可以將find的輸出保存到文件中,然後使用該文件。

$ find -name "*.java" | tee filelist.save 
src/file1.java 
... 
src/file5.java 
... 
$ vi $(grep file5 filelist.save) 
+0

我希望能有一個像'vi€5'這樣的魔術師,但這個很好!我會用它!而不是!find(重新執行最後一個命令),也許寫一個小腳本來減少擊鍵 – AndresQ 2012-04-27 18:12:56

+1

'!!'會重複上一個命令所做的任何操作,如果你有興趣做這個稍微寬泛的操作。 – 2012-04-27 18:31:43

1

在你的grep命令中加-n 5就可以做到這一點。

〜/ some/dir $ find | grep的-n 5的Java

+0

問題是我無法知道在執行找到哪一行是我想要編輯的文件之前它必須在兩個不同的命令 – AndresQ 2012-04-27 17:50:15

+1

啊,但有人已經回答說,你可以使用一個子shell如vi $(find | grep -n 5 java)。 – johnshen64 2012-04-27 18:02:29

相關問題