Нано вставить новую строку в поиске и заменить

По сути, мне нужно дважды вставить часть текста. Я знаю, что могу сделать это с:

sed G

но было бы здорово, если бы я мог сделать это прямо в Нано.

Я пытался найти конец строки ($), а затем заменить его такими вещами, как \n или же [:newline:] но кажется, что RegExp распознается только для поиска, а не для замены - он всегда вставляет буквенное выражение.

Однако этот вопрос говорит о том, что это возможно. Хотя я не могу понять, как. И да, у меня есть:

set regexp

в моем.nanorc

5 ответов

Решение

set regexp в вашем конфигурационном файле будет:

Выполните расширенный поиск по регулярному выражению по умолчанию.

Вы также можете активировать его в интерактивном режиме с Meta + R *

Но это все! Поиск с использованием RegEx, но в качестве замены Nano принимает только строки, кроме ссылочных захваченных групп \1 в \9,

Редакция Nano RegEx является реализацией POSIX, и для того, что бы вас заинтересовало, она не вычисляет [:newline:] но принимает \s, [:cntrl:] (Управляющие символы) и [:space:] (Все пробельные символы, включая разрывы строк) также отменяют классы POSIX: [^[:graph:]]

Ответ

Это не может быть сделано, ничего не работает, попробовал:

  • Отображение пробелов Meta + P - без видимых изменений
  • Дословный ввод Meta + Shift + V, затем нажатие Enter переведет в видимый ^M кодировка (но работает для ввода Tab)
  • " Специальные функции " Esc + Esc, затем трехзначная последовательность - управляющие символы не принимаются (но допускаются видимые символы) 013 будет интерпретировать это как пользователь нажал Enter)
  • Ввод Unicode Ctrl + Shift + U - управляющие символы не принимаются (но принимает видимые символы)

ASCII коды для некоторых управляющих символов:

      DEC   HEX   
(\t)    9  0x09   Horizontal Tab
(\n)   10  0x0a   New Line
(\r)   13  0x0d   Carriage Return
 ( )   32  0x20   Space

Нано команды:

  • Поиск Ctrl + W
  • Найти следующую мету + W *
  • Переключить замену при поиске Ctrl + R
  • Поиск и замена Ctrl + \

* Мета обычно является клавишей Alt


PS: "Иногда неудача - это ответ, или кто-то должен доказать, что я неправ"
PPS: пожалуйста

Мало того, что в настоящее время это невозможно сделать в nano, но мой запрос функции также помечен как "wontfix, too hard" в трекере ошибок.

  1. Выберите текстовый блок.
  2. Нажмите команду вставки.
  3. Нажмите команду flipexecute.
  4. Нажмите команду flippipe.
  5. Нажмите команду flipnewbuffer.
  6. Выполните любую внешнюю команду, которую вы хотите. Команда передаст выборку в стандартный ввод, а выбор будет заменен на стандартный вывод команды.

Кроме того, вы можете автоматизировать это путем записи и запуска макросов. Вы также можете привязать ключи к макропоследовательностям.

В Nano 6.4 вы можете сделать это так (или подобным образом, если вам не нравится мой конкретный метод):

Откройте файл ~/.nanorc с помощью Nano (а не какого-либо другого редактора).

Типbind F7 "|reg "" """ main

Затем поместите курсор междучто вы напечатали. Затем нажмите Alt+v, а затем нажмите Ctrl+t. Он должен выводить некоторые символы. Затем перейдите непосредственно перед последней двойной кавычкой и нажмите Alt+v; затем нажмите клавишу со стрелкой влево; повторите это (с помощью Alt+v, а затем клавиши со стрелкой влево) еще три раза (должно быть выведено несколько символов, поэтому в итоге должно получиться что-то вроде.

Сохраните и закройте файл .nanorc.

Затем создайте этот скрипт Python (назовите его ; вам не нужно добавлятьдо конца, если вы этого не хотите; сделать его исполняемым, например) и поместите его на свой путь (если вы используете Ubuntu, если вы сделаетекаталог (так что вы можете поместить его в), он останется на вашем пути после перезагрузки компьютера (в противном случае вы можете указать желаемый путь в файле ~/.bashrc); в любом случае, вот код дляфайл:

      #!/usr/bin/env python3

import re, sys

text=sys.stdin.read()
reg=""
if len(sys.argv)==3:
    #Usage: ctrl+t; |reg.py "my regex" "my replacement" (don't forget the quotes, or some such)
    reg=sys.argv[1]
    rep=sys.argv[2]
    result=re.sub(reg, rep, text)
elif len(sys.argv)==2:
    reg=sys.argv[1]
    result="\n".join(re.findall(reg, text))
else:
    result=re.sub(r"", r"", text) #Edit the regular expression here.
print(result)

Закройте Nano, если он открыт.

Откройте Нано.

Теперь каждый раз, когда вы нажимаете F7, будет запускаться командное меню/подсказка с текстом по умолчанию., с курсором между первым набором двойных кавычек. Поместите искомый текст в первый набор кавычек, а текст замены — во второй набор кавычек. Нажмите Enter, когда вы хотите сделать замену. Это позволяет вам делать регулярные выражения, которые вы можете делать в Python 3.x, которые довольно хороши (и позволяют создавать новые строки, группы и другие вещи). Он будет искать и заменять весь файл, если вы не выбрали что-то (тогда он будет искать и заменять выделение, и по какой-то причине он всегда добавляет новую строку после выбора после замены).

Если вы просто сделаете один набор кавычек с регулярным выражением, он заменит ваш документ или выделение каждым из совпадений (вы можете отменить это, нажав Alt+u).

Если у вас нет кавычек, а просто сделайте, то он выполнит регулярное выражение по умолчанию, которое вы сохранили в программе Python с именем reg, которое вы указали в своем пути.

Если у вас нет Nano 6.4 и вы используете Ubuntu или что-то подобное, вы можете довольно легко скомпилировать его. Добавьте репозитории исходного кода для вашего средства обновления, если вы еще этого не сделали. Затем сделайте. Затем загрузите последний исходный код с сайта nano-editor.org и следуйте инструкциям в исходном коде для компиляции.

Информацию о перепривязке клавиш для выполнения внешних команд см. в документации Nanorc , в частности, в этой цитате:

привязать ключ "строка" меню

Заставляет данную клавишу производить заданную строку в заданном меню (или во всех меню, где эта клавиша существует, когда используются все). Строка может состоять из текста или команд или их сочетания. (Чтобы ввести команду в строку, перед нажатием клавиши нажмите M-V.)

Вы можете более эффективно фильтровать текст из nano, передав его через исполняемую команду:

  • При желании выберите текст для фильтрации (переместите курсор в начало, снова Alt Aпереместите курсор в конец Alt A)
  • Выполнять:Ctrl T
  • Новый буфер: Alt F(необязательно, иначе выделенный текст в текущем буфере заменяется)
  • Введите команду с вертикальной чертой перед ней, например: '|sed G'
    (обратите внимание, вы можете использовать Alt \при наборе текста для переключения добавления/удаления трубы)

Выделенный текст (или весь документ, если ничего не выбрано) будет передан через данную команду и заменен выходными данными.

(Или с выходными данными будет создан новый буфер, если вы выбрали этот вариант.)

Примечание: Ctrl Tработает только с nano 5.0. Ctrl RВместо этого для более старых версий вы можете сделать Ctrl X.

Другие вопросы по тегам