Windows komut satırını ( cmd.exe ) kullanarak dosya içeriğini programlı olarak düzenlemek istiyorum . * Nix'te bu görevler için sed var . Windows'ta herhangi bir yararlı yerel eşdeğeri var mı?
Yanıtlar:
Bugün powershell beni kurtardı.
Çünkü grep
var:
get-content somefile.txt | where { $_ -match "expression"}
veya
select-string somefile.txt -pattern "expression"
ve için sed
var:
get-content somefile.txt | %{$_ -replace "expression","replace"}
Daha fazla ayrıntı için Zain Naboulsis blog girişine bakın .
sed
(ve türü) birçok Unix komut paketi içinde yer alır.
sed
, grep
vb. kutunun dışında.-z
seçeneği destekleyen son 4.3 ve 4.4 sürümlerini sunarHerhangi bir şey yüklemek istemiyorsanız ve sisteminiz bir Windows Sunucusu değilse, bunun için bir komut dosyası dili (örneğin VBScript) kullanabilirsiniz. Aşağıda büyük, kelepçesiz bir bıçak var. Komut satırınız şöyle görünür
cscript //NoLogo sed.vbs s/(oldpat)/(newpat)/ < inpfile.txt > outfile.txt
oldpat ve newpat, Microsoft vbscript regex desenleridir . Açıkçası, sadece yedek komutu uyguladım ve bazı şeyleri varsaydım, ancak daha akıllı olmasını ve sed
komut satırını daha fazla anlayabilmenizi sağlayabilir .
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
Herhangi bir şey yüklemek istemiyorsanız (betiği başka makinelerde çalıştırılacak bir çözüme / programa / vb. Eklemek istediğinizi varsayıyorum), bir vbs betiği oluşturmayı deneyebilirsiniz (diyelim, 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
Ve bunu şu şekilde çalıştırıyorsun:
cscript replace.vbs "C:\One.txt" "Robert" "Rob"
"Bill weaver" tarafından sağlanan sed versiyonuna benziyor ama bence bu özel ('> </) karakterler açısından daha kolay.
Btw, bunu ben yazmadım ama nereden aldığımı hatırlayamıyorum.
> (Get-content file.txt) | Foreach-Object {$_ -replace "^SourceRegexp$", "DestinationString"} | Set-Content file.txt
Bu davranış
sed -i 's/^SourceRegexp$/DestinationString/g' file.txt
Powershell'i deneyebilirsin. Kullanabileceğiniz get-content ve set-content komutları bulunmaktadır.
sed
;-) ne yaptığına en az katkıda bulunan PowerShell'deki iki şeydir . -replace
Operatör muhtemelen daha iyi bir öneridir.
Fart.exe'yi deneyin. Bu, komut toplu iş programlarında kullanılabilen bir metin bul ve değiştir yardımcı programıdır.
Cygwin'i ( http://www.cygwin.com/ ) kurabilir ve buradan sed'i kullanabilirsiniz.
Kullandığım Cygwin . Cygwin ikili dosyalarını PATH'inize koyarsanız, bunları Windows Komut kabuğundan kullanabileceğinizi anlamayan birçok insanla karşılaşıyorum. Cygwin's Bash'i çalıştırmak zorunda değilsiniz.
Ayrıca , Microsoft'tan temin edilebilen Windows Services for Unix'e de bakabilirsiniz (ancak yalnızca Professional ve Windows'un üstü sürümlerinde).
edlin veya düzenle
ayrıca, Windows için birçok unix aracıyla birlikte gelen Unix için Windows Hizmetleri vardır. http://technet.microsoft.com/en-us/interopmigration/bb380242.aspx
Güncelleme 12/7/12 Windows 2003 R2, Windows 7 ve Server 2008 vb. Sürümlerde yukarıdakilerin yerini, eklenti olarak UNIX Tabanlı Uygulamalar için Alt Sistem (SUA) almıştır. Ancak yardımcı programları indirmeniz gerekir: http://www.microsoft.com/en-us/download/details.aspx?id=2391
GNU Araçlarına bakabilirsiniz , bunlar (diğer şeylerin yanı sıra) pencerelerde sed sağlar.
Windows için repl.bat
, SED ama doesn't require any additional download
veya kurulum yeteneğinin çoğuna sahip olan bir yardımcı toplu iş dosyası var . Bu, Jscript
özellikleri uygulamak için kullanan swift
ve doesn't suffer from the usual poison characters
toplu işlemeyi kullanan ve boş satırları kolaylıkla işleyen karma bir toplu iş dosyasıdır .
İndir repl
- https://www.dropbox.com/s/qidqwztmetbvklt/repl.bat
Yazar @dbenham, stack overflow ve dostips.com'dan.
Adlandırılan başka bir yardımcı toplu iş dosyası findrepl.bat
, Windows kullanıcısına yeteneklerinin çoğunu verir GREP
ve aynı zamanda Jscript
hibrit bir toplu iş dosyasına dayanır ve aynı şekilde bir hibrit toplu iş dosyasına dayanır . Repl.bat'ın faydalarını paylaşır
İndir findrepl
- https://www.dropbox.com/s/rfdldmcb6vwi9xc/findrepl.bat
Yazar, stack overflow'dan @aacini ve dostips.com
Bildiğim kadarıyla sed gibi hiçbir şey pencerelerle dolu değil. Bununla birlikte, sed, Windows için birkaç farklı biçimde kullanılabilir; Cygwin'in bir parçası olarak, tam bir POSIX alt sistemi istiyorsanız veya yalnızca komut satırında çalıştırmak istiyorsanız Win32 yerel yürütülebilir dosyası olarak.
Windows için Sed (GnuWin32 Projesi)
Windows'a özgü olması gerekiyorsa, önerebileceğim diğer tek şey, Windows tarafından desteklenen VBScript gibi eklentiler olmadan bir komut dosyası dili kullanmaktır.
Windows cmd.exe istemi için çalışan bir sed aracına ihtiyacım vardı. Eric Pement'in tek bir DOS .exe'ye sed portu benim için harika çalıştı.
Oldukça iyi belgelenmiştir .