эквивалент python для sed

Есть ли способ, без двойного цикла, чтобы выполнить то, что делает следующая команда sed

Входные данные:

Time Banana spinach turkey 

sed -i "/Banana/ s/$/Toothpaste/" file

Вывод:

 Time BananaToothpaste spinach turkey 

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

Список a содержит список букв b, имеет ту же группу номеров, но в другом порядке

Для каждой записи в A я хочу найти строку в B с тем же номером и добавить значение C в конец.

Надеюсь, это имеет смысл, даже если мой пример этого не делает.

Я делал следующее в Bash, и он работал, но это было очень медленно …

 for line in $(cat DATSRCLN.txt.utf8); do srch=$(echo $line | awk -F'^' '{print $1}'); rep=$(echo $line | awk -F'^' '{print $2}'); sed -i "/$(echo $srch)/ s/$/^$(echo $rep)/" tmp.1; done 

Благодаря!

Использование re.sub() :

 newstring = re.sub('(Banana)', r'\1Toothpaste', oldstring) 

Это захватывает одну группу (между первыми круглыми скобками) и заменяет ее ITSELF (часть \ number), за которой следует желаемый суффикс. Необходимо использовать r'' (необработанная строка), чтобы побег был правильно интерпретирован.

Если вы используете Python3, вам поможет следующий модуль: https://github.com/mahmoudadel2/pysed

 wget https://raw.githubusercontent.com/mahmoudadel2/pysed/master/pysed.py 

Поместите файл модуля в свой путь к модулю Python3, а затем:

 import pysed pysed.replace(<Old string>, <Replacement String>, <Text File>) pysed.rmlinematch(<Unwanted string>, <Text File>) pysed.rmlinenumber(<Unwanted Line Number>, <Text File>) 

Покойный участник гонки, вот моя реализация для sed в Python:

 import re import shutil from tempfile import mkstemp def sed(pattern, replace, source, dest=None, count=0): """Reads a source file and writes the destination file. In each line, replaces pattern with replace. Args: pattern (str): pattern to match (can be re.pattern) replace (str): replacement str source (str): input filename count (int): number of occurrences to replace dest (str): destination filename, if not given, source will be over written. """ fin = open(source, 'r') num_replaced = count if dest: fout = open(dest, 'w') else: fd, name = mkstemp() fout = open(name, 'w') for line in fin: out = re.sub(pattern, replace, line) fout.write(out) if out != line: num_replaced += 1 if count and num_replaced > count: break try: fout.writelines(fin.readlines()) except Exception as E: raise E fin.close() fout.close() if not dest: shutil.move(name, source) 

Примеры:

 sed('foo', 'bar', "foo.txt") 

заменит все «foo» на «bar» в файле foo.txt

 sed('foo', 'bar', "foo.txt", "foo.updated.txt") 

заменит все «foo» на «bar» в «foo.txt» и сохранит результат в «foo.updated.txt».

 sed('foo', 'bar', "foo.txt", count=1) 

заменит только первое вхождение «foo» на «bar» и сохранит результат в исходном файле «foo.txt»

Это можно сделать, используя tmp-файл с низкими системными требованиями и только одну итерацию без копирования всего файла в память:

 #/usr/bin/python import tempfile import shutil import os newfile = tempfile.mkdtemp() oldfile = 'stack.txt' f = open(oldfile) n = open(newfile,'w') for i in f: if i.find('Banana') == -1: n.write(i) continue # Last row if i.find('\n') == -1: i += 'ToothPaste' else: i = i.rstrip('\n') i += 'ToothPaste\n' n.write(i) f.close() n.close() os.remove(oldfile) shutil.move(newfile,oldfile) 

Вы действительно можете вызвать sed из python. Много способов сделать это, но мне нравится использовать модуль sh. (yum -y install python-sh)

Результат моей примерной программы следующий.

 [me@localhost sh]$ cat input Time Banana spinich turkey [me@localhost sh]$ python test_sh.py [me@localhost sh]$ cat input Time Toothpaste spinich turkey [me@localhost sh]$ 

Вот test_sh.py

 import sh sh.sed('-i', 's/Banana/Toothpaste/', 'input') 

Вероятно, это работает только под LINUX.