2014-03-05 65 views
2

如果我需要從第1293行開始將文件從文件的最後一行開始擦除,我該怎麼做?如何讓grep從指定的行號開始搜索

更多詳細信息的情況下,它可以幫助:
我試圖掀起我的.bashrc的快速功能,可以讓我快速搜索vim的代碼片段文件的特定片斷呼應片段名稱和相關的命令(或多個)屏幕。所以我沒有probs獲取片段名稱的行號,甚至打印出下面一行num的命令。但如果片段是一個多行命令,那麼我需要grep以片段「^ snippet」開始的下一行,然後返回所有行,但我找不到任何細節,我可以如何讓grep開始其搜索從特定的行號開始。

第二個問題是如何.bashrc函數可以提前退出函數?當我使用'exit'命令 目前在下面的功能中註釋掉時,終端本身退出/關閉而不是退出功能。

function vsls() { 
if [[ "$2" =~ ^(html|sh|vim)$ ]] ; then 
    sPath="$2".snippets 
elif [[ "$2" =~ ^(html|sh|vim).snippets$ ]] ; then 
    sPath="$2" 
else 
    echo "\nExiting. You did not enter a recognized vim snippets file name." 
# exit 69 
fi  
    lnN=$(more $HOME/.vim/snippets/"$sPath"|grep -nm 1 $1|sed -r 's/^([0-9]*):.*$/\1/') ; echo "\$lnN: ${lnN}" 
    cntr="$lnN" 
    sed -n "$cntr"p "$HOME/.vim/snippets/$sPath" 
    ((cntr++)) 
    sed -n "$cntr"p "$HOME/.vim/snippets/$sPath" 
} 

@chepner 我不知道爲什麼(缺乏知識可能),但沒有指定「多」我得到一個權限錯誤:

03:43 ~ $ fLNum=$($HOME/.vim/snippets/"$sPath"|grep -nm 1 tdotti|sed -r 's/^([0-9]*):.*$/\1/') ; echo "\$fLNum: ${fLNum}" 
bash: /home/user/.vim/snippets/html.snippets: Permission denied 
$fLNum: 
03:43 ~ $ fLNum=$(more $HOME/.vim/snippets/"$sPath"|grep -nm 1 tdotti|sed -r 's/^([0-9]*):.*$/\1/') ; echo "\$fLNum: ${fLNum}" 
$fLNum: 1293 

現在工作根據需要
我堅持使用sed,因爲我感覺最舒服的使用sed。我以前使用過-n打印選項,但不會太頻繁,所以它完全逃脫了我的想法嘗試類似的東西。

function vsls() { 
if [[ "$2" =~ ^(html|sh|vim)$ ]] ; then 
    sPath="$2".snippets 
elif [[ "$2" =~ ^(html|sh|vim).snippets$ ]] ; then 
    sPath="$2" 
else 
    echo "\nExiting. You did not enter a recognized vim snippets file name." 
# exit 69 
fi  

    fLNum=$(more $HOME/.vim/snippets/"$sPath"|grep -nm 1 "snippet $1"|sed -r 's/^([0-9]*):.*$/\1/') ; echo "\$fLNum: ${fLNum}" #get line number of the snippet name searched, entered as input $1 
    ((tLNum1 = fLNum+=1)) ; echo "\$tLNum1: ${tLNum1}" # tmpLineNum is next line num from which to start next grep search for lineNum of next snippet entry to determine where commands of desired snippet end 
    tLNum2=$(sed -n "${tLNum1},$ p" $HOME/.vim/snippets/"$sPath"|grep -nm 1 "snippet"|sed -r 's/^([0-9]*):.*$/\1/') ; echo "\$tLNum2: ${tLNum2}" #lineNum of next 'snippet entry' 
    let sLNum=tLNum2+fLNum sLNum-=1 ; let sLNum-=1 ; echo "\$sLNum: ${sLNum}" #tmpLineNum2 is not actual line num in file, but rather the number of lines since the start of the second search, that is necessarily somewhere within the file: so if second search begins on line 1294, for all intents and purpose actual line num 1294 is line 1 of the new (second) search; therefore I need to add the tLNum2 with fLNum to determine actual lineNum in the of the next snippet entry 

    echo "" 
    sed -n "${fLNum},${sLNum} p" "$HOME/.vim/snippets/$sPath" 
    echo "" 
} 

但它是好奇,爲什麼我需要做的:

let sLNum=tLNum2+fLNum sLNum-=1 ; let sLNum-=1 

獲得第二個grep的搜索正確的行號。我只是很幸運打打鬧鬧,B/C我會想到:

let sLNum=tLNum2+fLNum sLNum-=1 

或: 讓sLNum = tLNum2 + fLNum;讓sLNum- = 1 應該已經做到了;即secondLineNum = tmpLNum2 + firstLineNum,然後是secondLineNum - 1.但結果永遠不會減少1,但總是等於tLNum + fLNum。很好理解爲什麼沒有按預期工作。

但它的工作。那謝謝啦。

+0

'more'的意思是交互使用。只需將文件名作爲第二個必需的參數傳遞給'grep'即可。 – chepner

+0

您需要更多,因爲您正在嘗試執行該文件。使用'cat'或'grep -opts patt文件' –

+0

@glennjackman:yeap貓的工作原理也一樣。不像Chepner指出的那樣互動性更強,肯定是更好的解決方案。它確實發生在我+ x文件中,但後來我無法想象爲什麼它需要exe權限。 – nanker

回答

2

或用sed的是這樣的:

sed -n "1293,$ p" yourfile | grep xyz 

或者,如果行號是在一個名爲line變量:

sed -n "${line},$ p" yourfile | grep xyz 

或者,如果您希望grep在第一行1292行中找不到任何內容,但如果使用的是grep -n,則仍然報告正確的行號,您可以獲取grep的(空)保留緩衝區以查看第1至1292行

sed "1,1292g" yourfile | grep -n xyz 
+1

善良,不需要grep如果你使用sed:'sed -n'1293,$ {/ xyz/p}'文件' –

+0

@glenn jackman好點,但我需要-m 1特性grep優惠只返回第一個匹配的行號我非常確定sed有一個類似的功能,但我不知道我的頭頂上的語法,所以我寧願隨便使用。 – nanker

+0

我錯過了這一點(沒有讀過這個巨大的問題)。在第一場比賽後退出:'sed -n'1293,$ {/ xyz/{p; }}'file' –

1
tail -n +1293 file | grep .... 
2

awk更適合這個

awk '/search_pattern/ && NR > 1292' filename 
+1

我認爲你需要'&&'這兩個條件之間。在這種特殊情況下,'{print $ 0}'不是必需的,因爲這是默認操作。 'awk'/ search_pattern/&& NR> 1292'文件名'應該這樣做。 –

+0

@凱瑟湯普森謝謝,我錯過了。 – Amit

相關問題