需要将文件中的某些标记替换为文件名
我有一堆文本文件,需要把里面的一个标记替换成文件的名字。
有没有简单的方法可以做到这一点?我比较喜欢用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