Chcę programowo edytować zawartość pliku za pomocą wiersza poleceń systemu Windows ( cmd.exe ). W * nix jest sed do tego zadania. Czy jest jakiś przydatny natywny odpowiednik w systemie Windows?
Chcę programowo edytować zawartość pliku za pomocą wiersza poleceń systemu Windows ( cmd.exe ). W * nix jest sed do tego zadania. Czy jest jakiś przydatny natywny odpowiednik w systemie Windows?
Odpowiedzi:
Dzisiaj PowerShell mnie uratował.
Bo grep
jest:
get-content somefile.txt | where { $_ -match "expression"}
lub
select-string somefile.txt -pattern "expression"
a ponieważ sed
jest:
get-content somefile.txt | %{$_ -replace "expression","replace"}
Więcej szczegółów można znaleźć we wpisie na blogu Zain Naboulsis .
sed
(i im podobne) są zawarte w kilku pakietach poleceń systemu Unix.
sed
, grep
itp. po wyjęciu z pudełka.-z
opcję w przeciwieństwie do wymienionych górnych portówJeśli nie chcesz instalować niczego a system nie jest Windows Server jeden, to mógłby użyć języka skryptowego (VBScript EG) do tego. Poniżej znajduje się obrzydliwe dźgnięcie z mankietu. Twoja linia poleceń będzie wyglądać
cscript //NoLogo sed.vbs s/(oldpat)/(newpat)/ < inpfile.txt > outfile.txt
gdzie oldpat i newpat to wzorce regex Microsoft vbscript . Oczywiście zaimplementowałem tylko polecenie zastępowania i założyłem kilka rzeczy, ale możesz to rozwinąć, aby być mądrzejszym i lepiej zrozumieć sed
wiersz poleceń.
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
Jeśli nie chcesz niczego instalować (zakładam, że chcesz dodać skrypt do jakiegoś rozwiązania / programu / itp., Które będzie uruchamiane na innych komputerach), możesz spróbować utworzyć skrypt vbs (powiedzmy, zamień.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
I uruchamiasz to w ten sposób:
cscript replace.vbs "C:\One.txt" "Robert" "Rob"
Która jest podobna do wersji sed dostarczonej przez "bill weaver", ale myślę, że ta jest bardziej przyjazna pod względem znaków specjalnych ('> </).
Przy okazji, nie napisałem tego, ale nie pamiętam, skąd to wziąłem.
> (Get-content file.txt) | Foreach-Object {$_ -replace "^SourceRegexp$", "DestinationString"} | Set-Content file.txt
To jest zachowanie
sed -i 's/^SourceRegexp$/DestinationString/g' file.txt
Możesz spróbować PowerShell. Istnieją wbudowane polecenia get-content i set-content , których można użyć.
sed
robi ;-). -replace
Operator jest prawdopodobnie lepsza propozycja.
Spróbuj fart.exe. Jest to narzędzie do znajdowania i zastępowania tekstu, którego można używać w programach wsadowych poleceń.
Możesz zainstalować Cygwin ( http://www.cygwin.com/ ) i stamtąd używać seda.
Używam Cygwin . Spotykam wiele osób, które nie zdają sobie sprawy, że jeśli umieścisz pliki binarne Cygwin na swojej ścieżce PATH, możesz ich używać z poziomu powłoki poleceń systemu Windows. Nie musisz uruchamiać Cygwin's Bash.
Możesz również zajrzeć do usług systemu Windows dla systemu Unix dostępnych od firmy Microsoft (ale tylko w wersji Professional i nowszych wersjach systemu Windows).
edlin lub edit
dodatkowo jest Windows Services for Unix, który zawiera wiele narzędzi unixowych dla Windows. http://technet.microsoft.com/en-us/interopmigration/bb380242.aspx
Aktualizacja 12/7/12 W systemie Windows 2003 R2, Windows 7 i Server 2008 itd. Powyższe rozwiązanie zostało zastąpione przez podsystem aplikacji opartych na systemie UNIX (SUA) jako dodatek. Ale musisz pobrać narzędzia: http://www.microsoft.com/en-us/download/details.aspx?id=2391
Możesz spojrzeć na Narzędzia GNU , które zapewniają (między innymi) sed w systemie Windows.
Istnieje pomocniczy plik wsadowy dla systemu Windows o nazwie, repl.bat
który ma wiele możliwości SED, ale doesn't require any additional download
lub instalacji. Jest to hybrydowy plik wsadowy, który wykorzystuje Jscript
do implementacji funkcji i tak jest swift
, a także doesn't suffer from the usual poison characters
przetwarzania wsadowego i obsługuje z łatwością puste wiersze.
Pobierz repl
z - https://www.dropbox.com/s/qidqwztmetbvklt/repl.bat
Autorem jest @dbenham z stack overflow i dostips.com
Inny plik wsadowy pomocnika, o nazwie, findrepl.bat
daje użytkownikowi systemu Windows wiele możliwości GREP
i jest również oparty naJscript
pliku wsadowym hybrydowym. Ma zalety repl.bat
Pobierz findrepl
z - https://www.dropbox.com/s/rfdldmcb6vwi9xc/findrepl.bat
Autorem jest @aacini z stack overflow i dostips.com
O ile wiem, nic takiego jak sed nie jest dostarczane z oknami. Jednak sed jest dostępny dla systemu Windows w kilku różnych formach, w tym jako część Cygwin, jeśli chcesz mieć pełny podsystem POSIX, lub jako natywny plik wykonywalny Win32, jeśli chcesz uruchomić seda w wierszu poleceń.
Sed dla Windows (projekt GnuWin32)
Jeśli ma być natywny dla systemu Windows, jedyną inną rzeczą, którą mogę zasugerować, byłoby użycie języka skryptowego obsługiwanego przez system Windows bez dodatków, takich jak VBScript.
Potrzebowałem narzędzia sed, które działałoby z monitem Windows cmd.exe. Port Eric Pementa od sed do jednego exe DOS pracował wielki dla mnie.
Jest to całkiem dobrze udokumentowane .