Я хотел бы показать определенную строку или строки файла с контекстом, вроде унифицированного diff, в командной строке в 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()

Есть простой способ сделать это?

5 ответов5

7

Часто, когда я ищу что-то в 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 и т.д.

4

Попробуй это

head -157 <filename> | tail -7

Требуется немного арифметики, но в основном идея такова:

head -<line number + trailing lines> | tail -<total lines to see>
2

поглазеть:

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

Просто вставьте его в сценарий оболочки.

1

Да, есть несколько способов сделать это. В Баш:

line=154 ; offset=4 ; ((start=line-offset)) ; ((end=line+offset)) ; cat -n stuff.py | sed -n "$start,$end p"

Вы можете поместить все это в функцию или скрипт.

0

Это использует 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()

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .