需要使用文件名替换文件中的某些标记

时间:2011-12-21 20:16:48

标签: python powershell grep notepad++ replace

在文本文件列表中,我需要用文件名替换一个标记。

有一种简单的方法吗?对我来说首选的工具是notepad ++,但grep,python,powershell或其他方式也可以。我在窗户上工作。

示例:

文件名

  

contact.aspx

     

的Default.aspx

内容第一个文件

  

Hallo<%= Html.Resource(“Title”)%>

内容第二档

  

怎么了<%= Html.Resource(“Title”)%>

所需的结果是:

第一个文件

  

Hallo<%= Resource.contact_aspx.Title%>

第二档

  

怎么了<%= Resource.default_aspx.Title%>

我不需要这里的完整解决方案:只有让我在替换语句中使用文件名的部分才能让我开始。

5 个答案:

答案 0 :(得分:1)

您可以使用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())

答案 1 :(得分:0)

如果您可以使用awk,那么这可能会有所帮助 -

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

上述单行将字段分隔符输出字段分隔符设置为%。查找包含模式/Html.Resource\("Title"\)/的行。如果找到它,它将运行用$ strong替换$ 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 %>

答案 2 :(得分:0)

我借鉴了: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)

答案 3 :(得分:0)

以下正则表达式通常会替换Html.Resource,您可以使用python的open(...)和os.path utils来遍历和跟踪文件名,以便在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 %>'

答案 4 :(得分:0)

以下是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