Windows コマンド ライン ( cmd.exe )を使用して、ファイルの内容をプログラムで編集したいと考えています。*nix には、このタスク用のsedがあります。Windows に有用なネイティブの同等物はありますか?
16 に答える
今日、powershell が私を救ってくれました。
がgrep
あるからです:
get-content somefile.txt | where { $_ -match "expression"}
また
select-string somefile.txt -pattern "expression"
そして、次のsed
とおりです。
get-content somefile.txt | %{$_ -replace "expression","replace"}
Replace PowerShell 関数の詳細については、この Microsoft の記事を参照してください。
sed
(およびその同類) は、Unix コマンドのいくつかのパッケージに含まれています。
- Cygwinは動作しますが、巨大です。
- UnxUtilsははるかにスリムです。
- GnuWin32は、動作する別のポートです。
- もう 1 つの代替手段は、AT&T Research のUWIN システムです。
- MinGw のMSYSも別のオプションです。
- Linux 用 Windows サブシステムは最も「ネイティブな」オプションですが、デフォルトでは Windows にインストールされません。
sed
ただし、grep
箱から出してすぐに使用できます。 - https://github.com/mbuilov/sed-windowsは最近の 4.3 および 4.4 バージョンを提供しており、リストされている上位ポートとは異なり、
-z
オプションをサポートしています。
何もインストールする必要がなく、システムが Windows Server ではない場合は、そのためにスクリプト言語 (VBScript など) を使用できます。以下は、それに対するひどい、すぐに使える刺し傷です。コマンドラインは次のようになります
cscript //NoLogo sed.vbs s/(oldpat)/(newpat)/ < inpfile.txt > outfile.txt
ここで、oldpat と newpat はMicrosoft vbscript 正規表現パターンです。sed
明らかに、私は代替コマンドを実装しただけで、いくつかのことを想定していますが、より賢く、コマンドラインをより理解するためにそれを肉付けすることができます。
Dim pat, patparts, rxp, inp
pat = WScript.Arguments(0)
patparts = Split(pat,"/")
Set rxp = new RegExp
rxp.Global = True
rxp.Multiline = False
rxp.Pattern = patparts(1)
Do While Not WScript.StdIn.AtEndOfStream
inp = WScript.StdIn.ReadLine()
WScript.Echo rxp.Replace(inp, patparts(2))
Loop
UnxUtilsは、 GNUWin32と同様に、Win32 用の sed を提供します。
何もインストールしたくない場合 (他のマシンで実行されるソリューション/プログラム/etc にスクリプトを追加することを想定しています)、vbs スクリプト (たとえば、replace.vbs) を作成してみてください。
Const ForReading = 1
Const ForWriting = 2
strFileName = Wscript.Arguments(0)
strOldText = Wscript.Arguments(1)
strNewText = Wscript.Arguments(2)
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile(strFileName, ForReading)
strText = objFile.ReadAll
objFile.Close
strNewText = Replace(strText, strOldText, strNewText)
Set objFile = objFSO.OpenTextFile(strFileName, ForWriting)
objFile.Write strNewText
objFile.Close
そして、次のように実行します。
cscript replace.vbs "C:\One.txt" "Robert" "Rob"
これは "bill weaver" が提供する sed バージョンに似ていますが、特殊な (' > </ ) 文字に関してはこちらの方が使いやすいと思います。
ところで、これは私が書いたものではありませんが、どこから入手したか思い出せません。
> (Get-content file.txt) | Foreach-Object {$_ -replace "^SourceRegexp$", "DestinationString"} | Set-Content file.txt
これはの動作です
sed -i 's/^SourceRegexp$/DestinationString/g' file.txt
sed の拡張版であるSuper Sedがあります。Windows の場合、これはスタンドアロンの .exe であり、コマンド ラインから実行することを目的としています。
PowerShellを試すことができます。使用できるget- contentコマンドレットとset-contentコマンドレットが組み込まれています。
Cygwinを使用しています。CygwinバイナリをPATHに配置すると、Windowsコマンドシェル内からそれらを使用できることに気付いていない人がたくさんいます。CygwinのBashを実行する必要はありません。
また、Microsoftから入手できるUnix用のWindowsサービスを調べることもできます(ただし、Professional以降のバージョンのWindowsのみ)。
fart.exe を試してください。これは、コマンド バッチ プログラムで使用できるテキストの検索と置換ユーティリティです。
Cygwin ( http://www.cygwin.com/ ) をインストールして、そこから sed を使用できます。
edlinまたは編集
さらに、Windows 用の多くの UNIX ツールに付属する Windows Services for Unix があります。 http://technet.microsoft.com/en-us/interopmigration/bb380242.aspx
Update 12/7/12 Windows 2003 R2、Windows 7 & Server 2008 などでは、上記はアドオンとして UNIX ベース アプリケーション用サブシステム (SUA) に置き換えられます。ただし、ユーティリティをダウンロードする必要があります: http://www.microsoft.com/en-us/download/details.aspx?id=2391
Windows 用のヘルパー バッチ ファイルが呼び出されrepl.bat
、SED の多くの機能とdoesn't require any additional download
インストールが可能です。Jscript
これは、機能を実装するために使用するハイブリッド バッチ ファイルでswift
ありdoesn't suffer from the usual poison characters
、バッチ処理の機能を実装し、空白行を簡単に処理します。
からダウンロードrepl
- https://www.dropbox.com/s/qidqwztmetbvklt/repl.bat
別のリンク - https://www.dostips.com/forum/viewtopic.php?f=3&t=6044
著者は、スタック オーバーフローおよび dotips.com の @dbenham です。
と呼ばれる別のヘルパー バッチ ファイルfindrepl.bat
は、Windows ユーザーに多くの機能を提供し、ハイブリッド バッチ ファイルGREP
に基づいてJscript
おり、同様にハイブリッド バッチ ファイルです。repl.bat の利点を共有します
からダウンロードfindrepl
- https://www.dropbox.com/s/rfdldmcb6vwi9xc/findrepl.bat
著者は、スタック オーバーフローおよび dotips.com の @aacini です。
GNU Toolsを見ることができます。それらは (とりわけ) sed on windows を提供します。
私の知る限り、sedのようなものはウィンドウにバンドルされていません。ただし、sedは、完全なPOSIXサブシステムが必要な場合はCygwinの一部として、コマンドラインでsedだけを実行する場合はWin32ネイティブ実行可能ファイルとしてなど、いくつかの異なる形式でWindowsで使用できます。
Sed for Windows(GnuWin32プロジェクト)
Windowsにネイティブである必要がある場合、私が提案できる他の唯一のことは、VBScriptなどのアドオンなしでWindowsでサポートされているスクリプト言語を使用することです。
Cygwin は動作しますが、これらのユーティリティも利用できます。それらをドライブに置いて、ディレクトリをパスに入れるだけで、使いやすい UNIX ユーティリティの多くが手に入ります。Cygwinよりも軽量な私見(ただし、それも同様に機能します)。
Windows cmd.exe プロンプトで機能する sed ツールが必要でした。Eric Pement による単一の DOS .exe へのsedの移植は、私にとって非常にうまく機能しました。
それはかなりよく文書化されています。