如果我需要从第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。很好理解为什么没有按预期工作。
但它的工作。那谢谢啦。
'more'的意思是交互使用。只需将文件名作为第二个必需的参数传递给'grep'即可。 – chepner
您需要更多,因为您正在尝试执行该文件。使用'cat'或'grep -opts patt文件' –
@glennjackman:yeap猫的工作原理也一样。不像Chepner指出的那样互动性更强,肯定是更好的解决方案。它确实发生在我+ x文件中,但后来我无法想象为什么它需要exe权限。 – nanker