如何使用Windows命令行环境查找和替换文件中的文本?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用Windows命令行环境查找和替换文件中的文本?相关的知识,希望对你有一定的参考价值。
我正在使用Windows命令行环境编写批处理文件脚本,并希望将文件中某些文本(例如“FOO”)的每次出现更改为另一个(例如“BAR”)。最简单的方法是什么?任何内置功能?
这里的很多答案帮助我指出了正确的方向,但是没有一个适合我,所以我发布了我的解决方案。
我有Windows 7,内置PowerShell。这是我用来查找/替换文件中所有文本实例的脚本:
powershell -Command "(gc myFile.txt) -replace 'foo', 'bar' | Out-File -encoding ASCII myFile.txt"
解释一下:
powershell
启动了powershell.exe,它包含在Windows 7中-Command "... "
是powershell.exe的命令行arg,包含要运行的命令(gc myFile.txt)
读取myFile.txt
的内容(gc
是Get-Content
命令的缩写)-replace 'foo', 'bar'
只需运行替换命令,用foo
替换bar
| Out-File myFile.txt
将输出传递给文件myFile.txt
-encoding ASCII
阻止将输出文件转录为unicode,正如评论指出的那样
Powershell.exe应该已经成为PATH语句的一部分,但如果没有,您可以添加它。它在我的机器上的位置是C:\WINDOWS\system32\WindowsPowerShell\v1.0
我知道我迟到了。
就个人而言,我喜欢以下解决方案: - sed -c s/FOO/BAR/g filename
我们还广泛使用Dedupe功能帮助我们每天通过SMTP发送大约500封电子邮件: - http://www.dostips.com/DtTipsStringManipulation.php#Snippets.Replace
这些都是本地工作,不需要额外的工具或实用程序。
REPLACE:
https://groups.google.com/forum/#!topic/alt.msdos.batch.nt/sj8IUhMOq6o
DEDUPLICATOR(注意使用-9表示ABA号码):
DEL New.txt
setLocal EnableDelayedExpansion
For /f "tokens=* delims= " %%a in (OLD.txt) do (
Set str=%%a
set str=!str:FOO=BAR!
echo !str!>>New.txt
)
ENDLOCAL
谢谢!
当你使用REM DE-DUPLICATE THE Mapping.txt FILE
REM THE DE-DUPLICATED FILE IS STORED AS new.txt
set MapFile=Mapping.txt
set ReplaceFile=New.txt
del %ReplaceFile%
::DelDupeText.bat
rem https://groups.google.com/forum/#!topic/alt.msdos.batch.nt/sj8IUhMOq6o
setLocal EnableDelayedExpansion
for /f "tokens=1,2 delims=," %%a in (%MapFile%) do (
set str=%%a
rem Ref: http://www.dostips.com/DtTipsStringManipulation.php#Snippets.RightString
set str=!str:~-9!
set str2=%%a
set str3=%%a,%%b
find /i ^"!str!^" %MapFile%
find /i ^"!str!^" %ReplaceFile%
if errorlevel 1 echo !str3!>>%ReplaceFile%
)
ENDLOCAL
然后简单地启动Git on Windows并使用git-bash
。或者,在使用Windows 10时,启动“在Windows上使用Ubuntu进行Bash”(来自Linux子系统)并使用sed
。
它是一个流编辑器,但可以使用以下命令直接编辑文件:
sed
sed -i -e 's/foo/bar/g' filename
选项用于在文件名上编辑。-i
选项表示要运行的命令。-e
用于将“foo”替换为“bar”,s
用于替换任何找到的匹配项。
ereOn注意:
如果要仅在Git存储库的版本化文件中替换字符串,则可能需要使用:
g
这是奇迹。
我使用过perl,这非常有效。
git ls-files <eventual subfolders & filters> | xargs sed -i -e 's/foo/bar/g'
.orig是它将附加到原始文件的扩展名
对于许多匹配的文件,例如* .html
perl -pi.orig -e "s/<textToReplace>/<textToReplaceWith>/g;" <fileName>
我在这里玩了一些现有的答案,更喜欢我改进的解决方案......
for %x in (<filePattern>) do perl -pi.orig -e "s/<textToReplace>/<textToReplaceWith>/g;" %x
或者如果要将输出再次保存到文件中......
type test.txt | powershell -Command "$input | ForEach-Object $_ -replace \"foo\", \"bar\" "
这样做的好处是可以管理任何程序的输出。也会考虑使用正则表达式。无法解决如何将其变成BAT文件以便于使用... :-(
随着type test.txt | powershell -Command "$input | ForEach-Object $_ -replace \"foo\", \"bar\" " > outputFile.txt
1)使用replacer.bat选项来评估特殊字符序列,如e?
和unicode序列。在这种情况下将取代引用的\n\r
和"Foo"
:
"Bar"
2)直接替换没有引用call replacer.bat "e?C:\content.txt" "\u0022Foo\u0022" "\u0022Bar\u0022"
和Foo
的地方。
Bar
这是我在Win XP上找到的解决方案。在我运行的批处理文件中,我包括以下内容:
call replacer.bat "C:\content.txt" "Foo" "Bar"
set value=new_value
:: Setup initial configuration
:: I use && as the delimiter in the file because it should not exist, thereby giving me the whole line
::
echo --> Setting configuration and properties.
for /f "tokens=* delims=&&" %%a in (config\config.txt) do (
call replace.bat "%%a" _KEY_ %value% config\temp.txt
)
del config\config.txt
rename config\temp.txt config.txt
文件如下。我没有找到在同一个批处理文件中包含该函数的方法,因为replace.bat
变量似乎总是给出for循环中的最后一个值。
%%a
:
replace.bat
看看@echo off
:: This ensures the parameters are resolved prior to the internal variable
::
SetLocal EnableDelayedExpansion
:: Replaces Key Variables
::
:: Parameters:
:: %1 = Line to search for replacement
:: %2 = Key to replace
:: %3 = Value to replace key with
:: %4 = File in which to write the replacement
::
:: Read in line without the surrounding double quotes (use ~)
::
set line=%~1
:: Write line to specified file, replacing key (%2) with value (%3)
::
echo !line:%2=%3! >> %4
:: Restore delayed expansion
::
EndLocal
,它要求在Windows下使用sed,也应该适用于这个问题。执行摘要:
- 它可以在批处理文件中完成,但它并不漂亮
- 很多可用的第三方可执行文件,如果您可以安装或只是复制exe,可以为您完成
- 如果你需要能够在没有修改的情况下在Windows机器上运行的东西,可以用VBScript或类似的东西来完成。
可能有点晚了,但我经常寻找类似的东西,因为我不想经历获得软件批准的痛苦。
但是,您通常以各种形式使用FOR语句。有人创建了一个有用的批处理文件来进行搜索和替换。看看Is there any sed like utility for cmd.exe。了解所提供的批处理文件的局限性非常重要。因此,我不会在此答案中复制源代码。
提供here函数的两个批处理文件由Stack Overflow成员search and replace
和dbenham
在Windows中使用aacini
编写。
与普通批处理脚本相比,它们都是native built-in jscript
和robust
,还有用于基本替换文本的very swift with large files
。他们都有simpler
模式匹配。
- This
Windows regular expression
帮助程序批处理文件名为sed-like
(由dbenham提供)。 使用repl.bat
文字开关的示例:L
- 这个
echo This is FOO here|repl "FOO" "BAR" L echo and with a file: type "file.txt" |repl "FOO" "BAR" L >"newfile.txt"
助手批处理文件名为grep-like
(由aacini提供)。 具有正则表达式的示例:findrepl.bat
两者都成为功能强大的系统级实用程序echo This is FOO here|findrepl "FOO" "BAR"
echo and with a file:
type "file.txt" |findrepl "FOO" "BAR" >"newfile.txt"
,或者可以在批处理文件的同一文件夹中使用,或者从cmd提示符中使用。
他们都有when placed in a folder that is on the path
开关和许多其他功能。
Powershell命令就像魅力一样
case-insensitive
如果您使用的是支持.Net 2.0的Windows版本,我会替换您的shell。 PowerShell从命令行为您提供.Net的全部功能。内置了许多命令行开关。以下示例将解决您的问题。我正在使用命令的全名,有更短的别名,但这给了你一些谷歌的东西。
(Get-Content test.txt) | ForEach-Object $_ -replace "foo", "bar" | Set-Content test2.txt