需要将文件中的某些标记替换为文件名

0 投票
5 回答
882 浏览
提问于 2025-04-17 08:48

我有一堆文本文件,需要把里面的一个标记替换成文件的名字。

有没有简单的方法可以做到这一点?我比较喜欢用Notepad++,不过用grep、python、powershell或者其他方法也可以。我是在Windows系统上工作。

举个例子:

文件名

contact.aspx

default.aspx

第一个文件的内容

你好 <%= Html.Resource("Title") %>

第二个文件的内容

最近怎么样 <%= Html.Resource("Title") %>

想要的结果是:

第一个文件

你好 <%= Resource.contact_aspx.Title %>

第二个文件

最近怎么样 <%= Resource.default_aspx.Title %>

我不需要完整的解决方案:只要能让我在替换语句中使用文件名的部分就可以让我开始了。

5 个回答

0

如果你会使用 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 %>
1

你可以使用 fileinput 这个模块。虽然让一个模块来重定向标准输出(stdout)听起来有点奇怪,但它应该可以这样工作:

#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

这里有一个用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

撰写回答