我正在开发一个应用程序。必须在整个项目中更改某条路径。路径是固定的,文件可以编辑(它是“.cshtml”)。
所以我认为我可以使用批处理文件将所有“http://localhost.com”更改为“http://domain.com”(我知道相对和绝对路径,但在这里我必须做到: - ))
因此,如果你有可以在文件中进行更改的代码,那就太棒了!
要完成我的问题,这里是文件路径和目录
MyApp
MyApp/Views
MyApp/Views/Index/page1.cshtml
MyApp/Views/Index/page2.cshtml
MyApp/Views/Another/page7.cshtml
...
感谢帮助我: - )
答案 0 :(得分:5)
这样的事情也可能有效:
#!/bin/bash
s=http://localhost.com
r=http://example.com
cd /path/to/MyApp
grep -rl "$s" * | while read f; do
sed -i "s|$s|$r|g" "$f"
done
修改或者不是,因为您刚刚从bash切换到batch-file。批处理解决方案可能如下所示:
@echo off
setlocal EnableDelayedExpansion
for /r "C:\path\to\MyApp" %%f in (*.chtml) do (
(for /f "tokens=*" %%l in (%%f) do (
set "line=%%l"
echo !line:
)) >"%%~ff.new"
del /q "%%~ff"
ren "%%~ff.new" "%%~nxf"
)
批量执行此操作确实是真的丑陋(虽然也容易出错),并且使用sed
for Windows或者(更好)执行此操作会好得多在PowerShell中:
$s = "http://localhost.com"
$r = "http://example.com"
Get-ChildItem "C:\path\to\MyApp" -Recurse -Filter *.chtml | ForEach-Object {
(Get-Content $_.FullName) |
ForEach-Object { $_ -replace [regex]::Escape($s), $r } |
Set-Content $_.FullName
}
请注意,-Filter
仅适用于PowerShell v3。对于早期版本,您必须这样做:
Get-ChildItem "C:\path\to\MyApp" -Recurse | Where-Object {
-not $_.PSIsContainer -and $_.Extension -eq ".chtml"
} | ForEach-Object {
(Get-Content $_.FullName) |
ForEach-Object { $_ -replace [regex]::Escape($s), $r } |
Set-Content $_.FullName
}
答案 1 :(得分:2)
你可以这样做:
find /MyApp -name "*.cshtml" -type f -exec sed -i 's#http://localhost.com#http://domain.com#g' {} +
find /MyApp -name "*.cshtml" -type f
查找.cshtml
结构中/MyApp
扩展名的文件。sed -i 's/IN/OUT/g'
将文本IN替换为文件中的OUT。sed -i 's#http://localhost.com#http://domain.com#g'
将http://localhost.com
替换为http://domain.com
。exec .... {} +
在find
找到的文件中执行....