我想在 Linux 的命令行上显示带有上下文的文件的某一行或多行,有点像统一的差异:
$ (something) -l 154 stuff.py
150: def foo(bar):
151: """
152: Does the thing.
153: """
>> 154: x = some_calculation()
155: y = something_else()
156: x.baz(y)
157: return x.quux()
是否有捷径可寻?
答案1
很多时候,当我在 grep 中搜索某些内容时,我会打开上下文选项 (-C)。因此,如果您想要基于搜索关键字的上下文,您可以这样做:
grep -C3 searchpattern file
这将为您提供上下文的上方 3 行和下方 3 行。根据需要增加/减少。您还可以使用 -A 数字(上方)和 -B 数字(下方)来获取上方和下方的具体数量。如果您想按行号进行具体操作,可以尝试使用 nl 命令对行进行编号,然后根据匹配的数字使用 grep -C3。例如,要获取第 26 行:
nl -n ln -ba inputfile | grep -C3 "^26 "
但这有点棘手,因为您必须将这些格式选项传递给 nl 以使其不在数字格式中放置制表符和其他内容。grep 还有一个行号选项(-n),您可以像这样将内容通过 grep 两次,首先基于不匹配任何内容(双引号),然后基于行号:
grep -n "" inputfile | grep -C3 "^26:"
只需确保在正则表达式中使用一些上下文来匹配行号,这样您就不会匹配诸如 126 或 260 等的内容。
答案2
尝试这个
head -157 <filename> | tail -7
需要一点算术,但基本思想是:
head -<line number + trailing lines> | tail -<total lines to see>
答案3
呆呆地:
awk -v L=154 'NR==L { printf ">> %5s: ", NR; print $0 ; next } (L-3 <= NR) && (NR <= L+3) { printf " %5s: ", NR; print $0 }' stuff.py
只需将其粘贴到 shell 脚本中即可。
答案4
这用于nl
添加可配置的行号。
参数 1 和 2 按照您的问题(但不是-l
)
参数 3 和 4 是引导线和尾线的数量(默认值为 3)
[[ "$1" == "" ]] && lnum=0 || lnum=$(($1)); ((lnum==0)) && echo "ERROR: Line number: $1" && exit 1
[[ ! -f "$2" ]] && echo "ERROR: Input file: $2" && exit 2 || file="$2"
[[ "$3" == "" ]] && lead=3 || ((lead=$3)) # default
[[ "$4" == "" ]] && tail=3 || ((tail=$4)) # default
((lnum<=lead)) && ((lead=lnum-1))
mesg="/tmp/$USER.$(basename $0).mesg"; [[ -f "$mesg" ]] && rm "$mesg"
marg=": "
mark=">>"
nl -s "$marg" "$file" \
| sed -n "$((lnum-lead)),$((lnum+tail)) p" | tee >(wc -l >"$mesg") \
| sed "s/^\([ ]*$lnum\)$marg\(.*\)/\1$mark\2/"
lnct=$(cat "$mesg"); rm "$mesg"
((lnct<((lead+tail+1)))) && echo "Waring: EOF"
输出
21:
22: class InsertTimestampPlugin(gedit.Plugin):
23: def __init__(self):
24>> gedit.Plugin.__init__(self)
25:
26: def insert_datetime(self, action, window):
27: doc = window.get_active_document()