Python: модуль pysed – расширенный аналог редактора sed

Автор: | 28/08/2014
 

PythonСтраница проекта на PyPI.

Там есть достаточно подробный HowTo с примерами, но мало показано применение модуля непосредственно в коде – больше в консоли.

В Python есть строковый метод replace:

Help on function replace in string:

string.replace = replace(s, old, new, maxsplit=-1)
replace (str, old, new[, maxsplit]) -> string

Return a copy of string str with all occurrences of substring
old replaced by new. If the optional argument maxsplit is
given, only the first maxsplit occurrences are replaced.

но pysed предоставляет больше возможностей, в том числе вариации методов strip, join  и т.п.

pysed использует три фукнции:

replace() – замена текста;
append() – вставка нового текста;
lines()– печать строк/символов;

Примеры вызова из скрипта.

Напечатать все строки:

#!/usr/bin/env python

import pysed

text = 'This is some long text.nChange me!nLine 3.nLine 4.nFinish.'

print 'nRunning usual lines print: n'
result = pysed.lines(text, 'all')
print result

Результат:

$ ./sed.py

Running usual lines print:

This is some long text.
Change me!
Line 3.
Line 4.
Finish.

Подсчёт строк в тексте:

print 'nRunning lines count: n'
result = pysed.lines(text, 'count')
print result

Результат:

$ ./sed.py

Running lines count:

0 <-- This is some long text.
1 <-- Change me!
2 <-- Line 3.
3 <-- Line 4.
4 <-- Finish.

Печать диапазона строк:

print 'nPrinting selected lines range: n'
result = pysed.lines(text, '[0-2]')
print result

Результат:

$ ./sed.py
Printing selected lines range:

This is some long text.
Change me!
Line 3.
Line 4.

Печать выбранных строк (1, 2 и 4):

print 'nPrinting selected lines numbers: n'
result = pysed.lines(text, '0, 1, 3')
print result

Результат:

$ ./sed.py

Printing selected lines numbers:

This is some long text.
Change me!
Line 4.

Печать строк с “шагом” – через 3 строки:

print 'nPrinting lines with step: n'
result = pysed.lines(text, 'step=3/*')
print result

Результат:

$ ./sed.py

Printing lines with step:

This is some long text.
Line 4.

Замена текста:

print 'nRunning replace: n'
replace = pysed.replace(text, 'Change me!', 'Changed you' + ' <--- :D')
print replace

Результат:

$ ./sed.py

Running replace:

This is some long text.
Changed you <--- :D
Line 3.
Line 4.
Finish.

Замена с подсветкой (зелёным):

print 'nRunning replace and colorizing: n'
replace = pysed.replace(text, 'Change me!', 'Changed you/green')
print replace

Результат (не увидим тут…):

$ ./sed.py

Running replace and colorizing:

This is some long text.
Changed you
Line 3.
Line 4.
Finish.

Замена всех символов нижнего регистра на точку:

print 'nRunning replace all lowercase symbols: n'
replace = pysed.replace(text, '[a-z]', '.')
print replace

Результат:

 $ ./sed.py

Running replace all lowercase symbols:

T... .. .... .... .....
C..... ..!
L... 3.
L... 4.
F......

Замена всех символов i в линиях 1-3:

print 'nRunning replace in selected lines: n'
replace = pysed.replace(text, 'lines=[0-2]/i', '.')
print replace

Результат:

$ ./sed.py

Running replace in selected lines:

Th.s .s some long text.
Change me!
L.ne 3.
Line 4.
Finish.

Заменить все вхождения слова Line на символы верхнего регистра:

print 'nRunning replace to UPPERcase one word: n'
replace = pysed.replace(text, 'upper/Line', 'line')
print replace

Результат:

$ ./sed.py

Running replace to UPPERcase one word:

This is some long text.
Change me!
LINE 3.
LINE 4.
Finish.

Заменить весь текст на прописные символы:

print 'nRunning replace to UPPERcase whole text: n'
replace = pysed.replace(text, 'upper=*/', '')
print replace

Результат:

$ ./sed.py

Running replace to UPPERcase whole text:

THIS IS SOME LONG TEXT.
CHANGE ME!
LINE 3.
LINE 4.
FINISH.

Добавить текст This is перед текстом Line:

print 'nRunning append (insert): n'
replace = pysed.append(text, 'Line', 'This is ')
print replace

Результат:

$ ./sed.py

Running append (insert):

This is some long text.
Change me!
This is Line 3.
This is Line 4.
Finish.

Пример работы с файлом.

Создадим файл:

$ echo "This is some text" > text.txt
$ cat text.txt
This is some text

Создадим скрипт:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import pysed

# создаём объект файла с текстом
with open('text.txt', 'r') as infile:
        text = infile.read()

print 'nOriginal text: ' + text

# меняем в тексте some на SOME
print 'Running replace...n'
newtext = pysed.replace(text, 'upper/some', 'some')

print 'New text: ' + newtext +'n'

# создаём нвоый файл и записываем в него результат
print 'Writing file...n'
with open('newtext.txt', 'w') as outfile:
        outfile.write(newtext)

# читаем содержимое нового файла
out = open('newtext.txt', 'r')
print 'Reading new text in old file:n'
print out.read() + 'n'

И результат его выполнения:

$ ./sed.py

Original text: This is some text

Running replace...

New text: This is SOME text

Writing file...

Reading new text in old file:

This is SOME text