Оценка emacs init.el от CLI

Часть 1

Просто dподнимаем 13-ю строку:

sed '13d' <file.txt

И общий способ сделать дополнение к вышесказанному:

sed '13!d' <file.txt

Часть 2

Потому что это можно сделать:

sed -n ':a;${P;q};N;4,$D;ba' <file.txt

Обратите внимание, что 4 - это на одно число больше, чем требуется. Так что если бы вы хотели последнюю 10-ю строку, это было бы 11.

Тестирование с помощью seq:

$ seq 100 | sed -n ':a;${P;q};N;4,$D;ba'
98
$ 

Попытка объяснения

:a        # define label a
${        # match the last line
    P     # print the first line of the pattern space
    q     # quit
}
N         # match all lines: append the next line to the pattern
4,${      # match the range of lines 4 to the end of the file
    D     # delete the first line of the pattern space
}
ba        # match all lines: jump back to label a 

Ценное дополнение Гленна Джекмана:

Это было "только N-я строка". Вот "all BUT the Nth line":

sed -n ':a;${s/^[^\n]*\n//;p;q};N;4,${P;D};ba'

работает с GNU sed, последовательность \n может не работать с другими seds.


Я попробовал это с BSD sed (OSX) и обнаружил, что это не совсем работает в приведенном выше виде. Похоже, что проблемы с:

  1. ;, использовавшейся для разделения строк, в общем, работает, но не работает после того, как метка
  2. BSD sed, кажется, требует ; после последней команды в однострочной группе команд {}, в то время как GNU sed не
  3. \n в общем может использоваться в регулярном выражении, но, по-видимому, не в выражении в скобках [] ]. Поэтому для исключения новых строк можно использовать нечто наподобие [[:alnum:][:punct:][:graph:][:blank:]], хотя это может исключать другие символы (в частности, другие управляющие символы).

Таким образом, это попытка создания более платформонезависимой версии:

sed -n ':a
${s/^[[:alnum:][:punct:][:graph:][:blank:]]*\n//p;q;};N;4,${P;D;};ba'

Похоже, что это работает под OSX и Ubuntu.

0
20.03.2014, 20:45
1 ответ

В Emacs есть опция - eval , которую вы можете использовать, подробности здесь . Но если вы делаете это часто, возможно, вам не захочется запускать весь emacs все время. Вместо этого вы можете запустить emacs-server, а затем просто использовать гораздо более легкий emacsclient ; см. здесь .

1
28.01.2020, 02:52

Теги

Похожие вопросы