如何使用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的内容(gcGet-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 replacedbenham在Windows中使用aacini编写。

与普通批处理脚本相比,它们都是native built-in jscriptrobust,还有用于基本替换文本的very swift with large files。他们都有simpler模式匹配。

  1. ThisWindows regular expression帮助程序批处理文件名为sed-like(由dbenham提供)。 使用repl.bat文字开关的示例: L
  2. 这个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
以上是关于如何使用Windows命令行环境查找和替换文件中的文本?的主要内容,如果未能解决你的问题,请参考以下文章

Eclipse怎么全局搜索替换

windows 命令行 如何查找文件路径

如何用sed命令替换一行中的某个字符串

Bash:使用另一个文件的行查找和替换文件中的行

如何在windows的命令行环境下编译C++程序?

linux系统替换文件怎么替换