cmd.exeのユーティリティのようなsedはありますか?[閉まっている]


149

Windowsコマンドライン(cmd.exe)を使用してプログラムでファイルの内容を編集したい。* nixには、このタスク用のsedがあります。Windowsで有用なネイティブ同等物はありますか?


1
「ネイティブ」とはどういう意味ですか??? cmd.exeで動作するようにインストールできますか、それともインストールなしで動作しますか?前者の場合は、以下のref'd GnuWin32を参照してください。後者の場合、違います。Windows用のプリインストールされたネイティブsedはありません。
Michael Paulukonis、2009年

6
ネイティブとは、追加のものをインストールせずにすべてのウィンドウで実行されるソリューションを意味しました。
JakubŠturc2009年

1
cmd.exeを残して、代わりにPowerShellを使用します。
Bill_Stewart 2015年


ファイルから特定の行を削除するだけの場合は、FIND /?を使用します。
John Henckel

回答:


117

今日powershellは私を救った。

以下の場合grepがあります:

get-content somefile.txt | where { $_ -match "expression"}

または

select-string somefile.txt -pattern "expression"

そして、のためにsedあります:

get-content somefile.txt | %{$_ -replace "expression","replace"}

詳細については、Zain Naboulsisのブログエントリを参照してください。


12
さらに、通常のcmdから呼び出す場合は、@ powershell -Command "get-content ..."を実行します。唯一の注意点は、引用符をエスケープする必要があることです。... -Command "get-content ... \" expression \ "、..."
Tarc

1
@Tarc AFAIR、コマンドで一重引用符を使用でき、代わりに二重引用符を使用してコマンドを引用できます

2
今日、ファイルでこれを試してみて、特定の場所の引用符の間のいくつかのものを削除しましたが、出力が元のファイルのほぼ2倍の大きさのファイルであることがわかりました。その理由は、このメソッドがファイル内の改行の処理方法を変更し、「\ n」ではなく「\ r \ n」を使用したためと思われます。
user132278 2016

1
\ r \ nによる二重化は、ファイルが改行だけで構成されていることを意味します。これが本当の理由です:encoding
Amit Naidu、2016年

2
@ and-bri(Get-Content c:\ temp \ test.txt).replace( '[MYID]'、 'MyValue')| Set-Content c:\ temp \ test.txt
AFP_555

94

sed (およびそのilk)は、Unixコマンドのいくつかのパッケージに含まれています。

何もインストールしたくない場合や、システムがWindows Serverでない場合、スクリプト言語(VBScriptなど)を使用できます。以下は、その場での大まかなオフカフスタブです。コマンドラインは次のようになります

cscript //NoLogo sed.vbs s/(oldpat)/(newpat)/ < inpfile.txt > outfile.txt

ここで、oldpatとnewpatはMicrosoft vbscript regexパターンです。明らかに、私は代用コマンドを実装し、いくつかのことを想定しましたが、よりスマートになり、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

1
これはまさに私が望んでいることではありませんが、VBSへの依存が最も軽いソリューションであると信じています。
JakubŠturc

7
GnuWin32 ネイティブソリューションですが、ネイティブとは(通常の)Windows環境で実行するように設計されている場合(CygWinとは異なります)。それらを試してみてください、そしてあなたはそれらがあなたが使うすべてのwindowsシステムにあると期待し始めるでしょう。!!!
Michael Paulukonis、2009年

3
私の場合はうまくいきます!また、 "// NoLogo" cscriptオプションも忘れないでください。
Marko Dumic 2010年

4
これが「カフス」である場合、他のコードはどのように見えるのでしょうか。すごい、ありがとう。
Sabuncu 2011

2
同様の正規表現検索および置換ユーティリティをJScriptで実行できます。VBScriptに対するJScriptの利点は、単一のスクリプトでバッチと簡単に組み合わせることができるため、ユーティリティをバッチまたはコマンドラインコンテキストで簡単に使用できることです。REPL.BATと呼ばれる堅牢なハイブリッドJScript / batchユーティリティが利用可能です。多くのコマンドラインオプションがあります。完全なドキュメントはスクリプト内に埋め込まれています。確かに完全なsed機能はありませんが、それでも非常に強力です。
dbenham 2013


17

何もインストールしたくない場合(他のマシンで実行されるソリューション/プログラムなどにスクリプトを追加したいと思います)、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バージョンに似ていますが、これは特殊( '> </)文字の点でよりフレンドリーだと思います。

ところで、私はこれを書きませんでしたが、どこから取得したのか思い出せません。



8
> (Get-content file.txt) | Foreach-Object {$_ -replace "^SourceRegexp$", "DestinationString"} | Set-Content file.txt

これは

sed -i 's/^SourceRegexp$/DestinationString/g' file.txt

1
それは完全に動作します。注:「get-content」の括弧は、後で「set-content」が呼び出されるときにファイルが使用されないようにするためのものです。
Kafu

似たようなことがcmdで可能ですか?これはpwshのみの理解
Ferroao

'SourceRegexp' mentは、考えられる正規表現に依存しますか?それは本当にPower Shellで機能しますか?
scjorge




6

Cygwinを使用します。CygwinバイナリをPATHに置いた場合、Windowsコマンドシェル内からそれらを使用できることを理解していない多くの人に出くわします。CygwinのBashを実行する必要はありません。

Microsoftから入手できるUnix用のWindowsサービスを調べることもできます(ただし、Professional以上のバージョンのWindowsでのみ)。


4

エドリンまたは編集

さらに、Windows用の多くのUNIXツールに付属するUnix用のWindowsサービスがあります。 http://technet.microsoft.com/en-us/interopmigration/bb380242.aspx

更新12/7/12 Windows 2003 R2、Windows 7およびServer 2008などでは、上記はアドオンとしてUNIXベースアプリケーション用サブシステム(SUA)に置き換えられます。ただし、ユーティリティをダウンロードする必要があります。http//www.microsoft.com/en-us/download/details.aspx?id = 2391


5
64ビットバージョンのWindowsでは、どちらも存在しません。
ジョーイ


3

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

作者はスタックオーバーフローとdostips.comの@dbenhamです

呼び出される別のヘルパーバッチファイルfindrepl.batは、Windowsユーザーに多くの機能を提供します。GREPまた、それに基づいてJscriptおり、ハイブリッドバッチファイルでもあります。repl.batの利点を共有します

ダウンロードfindreplから- https://www.dropbox.com/s/rfdldmcb6vwi9xc/findrepl.bat

作者はスタックオーバーフローとdostips.comから@aaciniです


replのドロップボックスリンクがダウンしています。二次リンクはありますか?
Vishal Anand

2

私が知る限り、sedのようなものはWindowsにバンドルされていません。ただし、完全なPOSIXサブシステムが必要な場合はCygwinの一部として、コマンドラインでsedだけを実行したい場合はWin32ネイティブ実行可能ファイルとして、sedをWindowsで使用できます。

Sed for Windows(GnuWin32プロジェクト)

それがWindowsにネイティブである必要がある場合、私が提案できる他の唯一のことは、VBScriptなどのアドオンなしでWindowsによってサポートされるスクリプト言語を使用することです。


1

Cygwinは機能しますが、これらのユーティリティも利用できます。ドライブにそれらを配置し、ディレクトリをパスに配置するだけで、多くの使いやすいUNIXユーティリティが手に入ります。Cygwinより軽量な私見(それも同様に機能します)。


0

Windowsのcmd.exeプロンプトで機能するsedツールが必要でした。Eric Pementの単一のDOS .exeへのsedの移植は、私にとってはうまくいきました。

それはかなり文書化されています


1
問題はDOSではなくWindows(cmd.exe)に関するものです
a_horse_with_no_name

@royhowie:なるほど。これらの回答のいくつかは誰かにとって役立つかもしれませんが、質問自体は実際にはSOに適していないことに同意します。OTOH、私はホールセール削除を勧める資格を感じません。
PM 2Ring 2015年

この状況では、リンクされたページでホストされている.exeファイルが必須部分であるため、回答の必須部分を含めるのは難しいと思います。link-rotの心配を完全に理解していますが、これをどのようにSOに内蔵させることができるかわかりません。
ブライアンケネディ2015年

キャッチ、a_horse_with_no_nameをありがとう。私は自分の言語でだらしませんでした。コメントを編集して、指摘された問題を修正しました。
ブライアンケネディ2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.