Блокнот ++ поступово замінюйте


83

Скажімо, я хочу мати 10 рядків даних, але хочу, щоб значення збільшувалось для кожного рядка чи фрагмента даних. Як збільшити це значення?

Наприклад .... Якщо у мене є ці рядки, чи існує регулярний вираз заміни значень id на збільшення?

<row id="1" />
<row id="1" />
<row id="1" />
<row id="1" />
<row id="1" />

--- Ось як я хотів би, щоб це виглядало ... (якщо ідентифікатор першого рядка піднімається вгору, це нормально)

<row id="1" />
<row id="2" />
<row id="3" />
<row id="4" />
<row id="5" />

Заміни Notepad ++ не обчислюють математику, як і регулярні вирази.
Бурштин

Якщо це можливо, це неймовірно важко. У регулярних виразах не існує поняття чисел (отже, немає +1), і немає простого способу накопичувати дані, коли ви збігаєтесь із регулярним виразом (тому не існує "наступного" збігу). XSLT може вам тут допомогти, якщо вам дійсно потрібно це автоматизувати.

@Amber Notepad ++ має обмежену функціональність регулярних виразів.
Karolis

@Karolis Я це дуже добре знаю. Я просто говорив, що ні регулярний вираз (вроджений), ні реалізація Notepad ++ пошуку та заміни за допомогою цього регулярного виразу не підтримують математику для заміни.
Бурштин

1
Незважаючи на те, що регулярний вираз згадувався (і позначався тегами) як можливий метод, операційна програма, здавалося, була менш заклопотаною конкретним методом, ніж просто знання, чи може Notepad ++ виконати завдання .... що відповідь voithos ідеально адресована.
jbobbins

Відповіді:


155

Не впевнений у регулярному виразі, але ви можете це зробити в Notepad ++, хоча він не надто гнучкий.

У прикладі, який ви дали, утримуйте Altта виберіть стовпець із числами, які ви хочете змінити. Потім перейдіть до Edit->Column Editorі виберіть Number to Insertперемикач у вікні, що з’явиться. Потім вкажіть свій початковий номер і приріст і натисніть OK. Він повинен виписати збільшені числа.

Примітка: це також працює з Multi-editingфункцією (вибір декількох місць, зберігаючи Ctrlнатиснуту клавішу).

Однак це далеко не така гнучкість, яку більшість людей знайде для себе корисною. Notepad ++ чудовий, але якщо ви хочете справді потужний редактор, який може робити такі речі з легкістю, я б сказав, що використовуєте Vim.


4
+1 як для незрозумілої функції стовпця, так і зауважуючи, що vim - це потужніший редактор. ;)
Спенсер Ратбун

Notepad ++ чудовий, було б чудово, якби у нас був такий потужний онлайн-редактор тексту, як цей.
Луїс Фейяо Веронесі

1
Для мене було: виділіть стовпець комбінацією клавіш Alt + Shift, а потім введіть число, яке потрібно вставити. Працює ідеально
Ромбус

Дякую! Ця функція чудова. Крім того, я зміг вибрати стовпець, двічі клацнувши його.
Рахім Ходжа

Просто кльово! Просто врятував мені життя, коли мені довелося підготувати 300 вставних заяв,
DoNuT,

14

Я шукав ту саму функцію сьогодні, але не зміг зробити це в Notepad ++. Однак ми маємо на допомогу TextPad. У мене це спрацювало.

У діалоговому вікні заміни TextPad увімкніть регулярний вираз; тоді ви можете спробувати замінити

<row id="1"/>

від

<row id="\i"/>

Подивіться на це посилання для подальших дивовижних функцій заміни TextPad - http://sublimetext.userecho.com/topic/106519-generate-a-sequence-of-numbers-increment-replace/


1
Я думаю, це допомагає, якщо я насправді звертаю увагу. Закінчилося встановлення SublimeText. :) Дякую.
rtf

1
Але обов’язково натисніть кнопку "Замінити все". "Замінити наступним" не збільшить лічильник. Щоб це зрозуміти, потрібні були години. \ i Замінити цифрами, починаючи з 1, збільшуючи на 1. \ i (10) Замінюючи цифрами, починаючи з 10, збільшуючи на 1. \ i (0,10) Замінюючи цифрами, починаючи з 0, збільшуючи на 10. \ i ( 100, -10) Замініть цифрами, починаючи з 100, зменшуючи на -10.
Венкатеш Муніянді

8

у мене була та ж проблема з понад 250 рядками, і ось як я це зробив:

наприклад :

<row id="1" />
<row id="1" />
<row id="1" />
<row id="1" />
<row id="1" />

ви помістіть курсор тільки після того, як «1» , і ви клацніть alt + shiftі почати спадний з вниз не стрілкою до вашої досяжності в нижньому рядку тепер ви бачите групу вибору натисніть на пере , щоб видалити номер 1 в кожному рядку одночасно і перейдіть до Edit -> Column Editorі виберіть Number to Insertпотім помістіть 1у поле початкового числа та 1збільшуйте поле та перевірте нульові числа та натиснітьok

Вітаю, ти це зробив :)


5

Оскільки реальних відповідей обмежено, я поділюсь цим обхідним шляхом. У справді простих випадках, як ваш приклад, ви робите це назад ...

Від цього

1
2
3
4
5

Замініть \r\nна, " />\r\n<row id="і ви отримаєте 90% шляху туди

1" />
<row id="2" />
<row id="3" />
<row id="4" />
<row id="5

Або подібним чином ви можете зламати дані за допомогою Excel / електронної таблиці. Просто розділіть вихідні дані на стовпці та обробляйте значення, як вам потрібно.

|   <row id="   |   1   |   " />    |
|   <row id="   |   1   |   " />    |
|   <row id="   |   1   |   " />    |
|   <row id="   |   1   |   " />    |
|   <row id="   |   1   |   " />    |

Очевидні речі, але це може допомогти комусь, хто робить дивну разову хакерську роботу, зберегти кілька ключових ударів.


5
заміна (.*)з <row id="\1" />в режимі регулярних виразів без . matches newlineотримає Вас 100% шляху.
satibel

4

http://docs.notepad-plus-plus.org/index.php/Inserting_Variable_Text

Notepad ++ оснащений редактором редагування -> стовпець "Alt + C", який може працювати над прямокутним виділенням двома різними способами: Coledit.png, вставляючи певний фіксований текст у кожен рядок, включаючи та слідуючи поточний рядок, у стовпці вставки точка (вона ж карет). Спочатку виділений текст залишається недоторканим. Як показано на малюнку, лінійний ряд чисел можна вставити таким же чином. Потрібно вказати початкове значення та приріст. Ліве заповнення нулями є опцією, і число може бути введене в базі 2, 8, 10 або 16 - так відображатимуться і обчислені значення, відступ базується на найбільшому.


Буде набагато краще, якщо ви прикріпите зображення у дописі, щоб уникнути плутанини, читаючи свою відповідь
Аміна Нураїні,


1

(Опублікування на випадок, якщо хтось може цим скористатися).

Я шукав вирішення проблеми, дещо складнішої, ніж OP - замінюючи КОЖНУ появу чогось числом числом на те саме, на збільшене число

Наприклад, Заміна приблизно такого:

<row id="1" />
<row id="2" />
<row id="1" />
<row id="3" />
<row id="1" />

За цим:

<row id="2" />
<row id="3" />
<row id="2" />
<row id="4" />
<row id="2" />

Не вдалося знайти рішення в Інтернеті, тому я написав власний сценарій у groovy (трохи потворно, але робить роботу):

 /**
 * <p> Finds words that matches template and increases them by 1.
 * '_' in word template represents number.
 *
 * <p> E.g. if template equals 'Row="_"', then:
 * ALL Row=0 will be replaced by Row="1"
 * All Row=1 will be replaced by Row="2"
 * <p> Warning - your find template might not work properly if _ is the last character of it
 * etc.
 * <p> Requirments:
 * - Original text does not contain tepmlate string
 * - Only numbers in non-disrupted sequence are incremented and replaced
 * (i.e. from example below, if Row=4 exists in original text, but Row=3 not, than Row=4 will NOT be 
 * replaced by Row=5)
 */
def replace_inc(String text, int startingIndex, String findTemplate) {
    assert findTemplate.contains('_') : 'search template needs to contain "_" placeholder'
    assert !(findTemplate.replaceFirst('_','').contains('_')) : 'only one "_" placeholder is allowed'
    assert !text.contains('_____') : 'input text should not contain "______" (5 underscores)'
    while (true) {
        findString = findTemplate.replace("_",(startingIndex).toString())
        if (!text.contains(findString)) break;
        replaceString = findTemplate.replace("_", "_____"+(++startingIndex).toString())
        text = text.replaceAll(findString, replaceString)
    }
    return text.replaceAll("_____","") // get rid of '_____' character
}

// input
findTemplate = 'Row="_"'
path = /C:\TEMP\working_copy.txt/
startingIndex = 0

// do stuff
f = new File(path)
outText = replace_inc(f.text,startingIndex,findTemplate)
println "Results \n: " + outText
f.withWriter { out -> out.println outText }
println "Results written to $f"

1

Ви можете зробити це за допомогою Powershell через регулярний вираз і foreach loop, якщо ви зберігаєте свої значення у файлі input.txt :

$initialNum=1; $increment=1; $tmp = Get-Content input.txt | foreach {  $n = [regex]::match($_,'id="(\d+)"').groups[1
].value; if ($n) {$_ -replace "$n", ([int32]$initialNum+$increment); $increment=$increment+1;} else {$_}; }

Після цього ви можете зберегти $ tmp у файлі за допомогою $tmp > result.txt. Для цього не потрібні дані, щоб бути в стовпцях.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.