bash - 如何让 grep 从指定的行号开始搜索

标签 bash

如果我需要从第 1293 行一直到文件末尾开始 grep 一个文件,我该怎么做?

更多详细信息以防有帮助:
我正在尝试在我的 bashrc 中创建一个快速函数,让我可以快速搜索 vim 代码片段文件以查找特定代码片段,并将代码片段名称和相关命令回显到屏幕上。所以我没有机会获得代码段名称的行号,甚至在下面的行号上打印出命令。但是,如果该代码段是多行命令,那么我需要 grep 以代码段“^snippet”开头的下一行,然后返回之间的所有行,但我找不到任何详细信息如何让 grep 开始搜索从特定的行号开始。

第二个问题是如何在 .bashrc 函数中提前退出该函数?当我使用“退出”命令时 当前在终端本身退出/关闭而不是仅仅退出函数的下方的函数中被注释掉。

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"
}

@切普纳 我不知道为什么(可能缺乏专业知识)但没有指定“更多”我得到一个权限错误:

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。最好了解为什么它没有按预期工作。

但它的工作。非常感谢。

最佳答案

或者像这样使用 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

关于bash - 如何让 grep 从指定的行号开始搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22207016/

相关文章:

Linux:非法选项读取-a

git - 您如何使用存储删除然后恢复非索引更改,而不会在 git 中发生 merge 冲突?

bash - 在终端中检测可用颜色以在 vim 中使用颜色方案的最优雅方法?

bash - 仅 grep 文本文件

linux - Bash - 从列表中递归搜索文件并将它们复制到目标

json - 如何使用命令行计算 JSON 对象中的项目?

bash - 如何使用 cURL 在 shell 中遍历远程文件的行?

bash - 如何在shell中按数字对字母数字进行排序

linux - 从无限输入流读取的 while 循环中的参数列表太长错误

django - powershell中的bash导出命令