Необходимо заменить некоторые токены в файле с именем файла - PullRequest
0 голосов
/ 22 декабря 2011

В списке текстовых файлов мне нужно заменить токен на имя файла.

Есть ли простой способ сделать это? Для меня предпочтительным инструментом будет notepad ++, но также можно использовать grep, python, powershell или другие. Я работаю на Windows.

Пример:

1010 * имена файлов *

contact.aspx

default.aspx

содержимое первого файла

Hallo <% = Html.Resource ("Title")%>

содержимое второго файла

Что случилось <% = Html.Resource ("Заголовок")%>

Требуемый результат:

первый файл

Hallo <% = Resource.contact_aspx.Title%>

второй файл

Что случилось <% = Resource.default_aspx.Title%>

Мне не нужно полное решение здесь: только часть, которая позволяет мне использовать имя файла в операторе замены, поможет мне начать.

Ответы [ 5 ]

1 голос
/ 22 декабря 2011

Вы можете использовать модуль fileinput .Немного неловко иметь стандартный модуль перенаправления модуля, но он должен работать так:

#usage: python thisscript.py token file file2 file3
import sys
from fileinput import input
token = sys.argv[1]
file_input = input(sys.argv[2:], inplace=True)
for line in file_input:
    print line.replace(token, file_input.filename())
0 голосов
/ 24 декабря 2011

Вот решение в Powershell:

(Get-Content -Path contact.aspx) -replace '(Hallo\s?<%=\s?)(.+?)(\s?%>)', '$1Resource.contact_aspx.Title$3' | Set-Content -Path contact.aspx

(Get-Content -Path default.aspx) -replace '(Whats\s?up\s?<%=\s?)(.+?)(\s?%>)', '$1Resource.default_aspx.Title$3' | Set-Content -Path default.aspx
0 голосов
/ 22 декабря 2011

Следующее регулярное выражение в общем случае заменит Html.Resource, и вы можете использовать утилиты python open (...) и os.path для обхода и отслеживания имен файлов для использования во втором аргументе sub.Итак, src будет содержимым файла, который вы будете записывать обратно из re.sub return

import re

fn = 'contact_aspx'
src = '<%= Html.Resource("Title") %>'

re.sub(r'<%= Html.Resource\("(.*)"\) %>', \
    r'<%= Resource.{0}.\1 %>'.format(fn), \
    src)

# outputs
# '<%= Resource.contact_aspx.Title %>'
0 голосов
/ 22 декабря 2011

Я позаимствовал у: https://stackoverflow.com/a/39110/1104941

Сохраните этот скрипт как файл .py.Поместите его в тот же каталог, где находятся файлы .aspx, которые вы хотите изменить (очевидно, храните оригиналы в надежном месте).

import os
from tempfile import mkstemp
from shutil import move

dir_list=os.listdir('.')
for fname in dir_list:
    if fname.split('.')[1] == 'aspx':
        #Create temp file
        fh, abs_path = mkstemp()
        new_file = open(abs_path,'w')
        old_file = open(fname, 'r')
        for line in old_file:
            if '<%= Html.Resource("Title") %>' in line:
                new_line = line.replace('<%= Html.Resource("Title") %>', '<%= Resource.' + '_'.join(fname.split('.')) + '.Title %>')
                new_file.write(new_line)
            else:
                new_file.write(line)    
        #close temp file
        new_file.close()
        os.close(fh)
        old_file.close()
        #Remove original file
        os.remove(fname)
        #Move new file
        move(abs_path, fname)
0 голосов
/ 22 декабря 2011

Если вы можете работать с awk, то это может помочь -

awk -v FS="%" -v OFS="%" '
/Html.Resource\("Title"\)/{sub(/.*/,"= Resource."FILENAME".Title ",$2); print;next}1
' Input_File

Вышеуказанная однострочная строка устанавливает разделитель поля и Разделитель поля вывода на %. Ищет строки, содержащие шаблон /Html.Resource\("Title"\)/. Если он находит его, он запускает действие, которое заменяет столбец $ 2 на FILENAME (который является встроенной переменной, содержащей имя файла), и печатает его и переходит к следующей строке. 1 - для строк, которые не содержат шаблон и печатаются как есть.

Тест:

[jaypal:~/Temp] cat default.aspx 
Whats up <%= Html.Resource("Title") %>

[jaypal:~/Temp] awk -v FS="%" -v OFS="%" '
> /Html.Resource\("Title"\)/{sub(/.*/,"= Resource."FILENAME".Title ",$2); print;next}1
> ' default.aspx
Whats up <%= Resource.default.aspx.Title %>

[jaypal:~/Temp] cat contact.aspx 
Hallo <%= Html.Resource("Title") %>

[jaypal:~/Temp] awk -v FS="%" -v OFS="%" '
> /Html.Resource\("Title"\)/{sub(/.*/,"= Resource."FILENAME".Title ",$2); print;next}1
> ' contact.aspx 
Hallo <%= Resource.contact.aspx.Title %>
...