Czy istnieje narzędzie podobne do seda dla cmd.exe? [Zamknięte]


149

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?


1
Co masz na myśli mówiąc „rodzimy” ??? Możliwość instalacji do pracy w cmd.exe lub do pracy bez jakiejkolwiek instalacji? Jeśli pierwszy, zobacz GnuWin32 poniżej; jeśli to drugie, nie. Brak preinstalowanego natywnego seda dla systemu Windows.
Michael Paulukonis

6
Przez natywny rozumiałem rozwiązanie, które działa na wszystkich oknach bez instalowania dodatkowych rzeczy.
Jakub Šturc

1
Pozostaw program cmd.exe i zamiast tego użyj programu PowerShell.
Bill_Stewart,


Jeśli chcesz tylko usunąć określone linie z pliku, użyj ZNAJDŹ /?
John Henckel,

Odpowiedzi:


117

Dzisiaj PowerShell mnie uratował.

Bo grepjest:

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

lub

select-string somefile.txt -pattern "expression"

a ponieważ sedjest:

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

Więcej szczegółów można znaleźć we wpisie na blogu Zain Naboulsis .


12
Dodatkowo: jeśli chcesz wywołać to z normalnego cmd, po prostu @powershell -Command "get-content ..." it. Jedynym zastrzeżeniem jest konieczność zmiany znaczenia w cudzysłowie: ... -Command "get-content ... \" expression \ ", ..."
Tarc,

1
@Tarc AFAIR, możesz użyć pojedynczych cudzysłowów w swoim poleceniu i zamiast tego użyć podwójnych cudzysłowów, aby zacytować polecenie

2
Próbowałem tego dzisiaj na pliku, aby usunąć niektóre rzeczy między cudzysłowami w niektórych miejscach, tylko po to, aby odkryć, że wynik był plikiem prawie dwa razy większym niż oryginał. Przyczyną wydaje się być to, że ta metoda zmieniła sposób obsługi nowych linii w pliku, aby używać „\ r \ n” zamiast „\ n”.
user132278

1
Podwojenie z powodu \ r \ n oznaczałoby, że plik składał się wyłącznie z nowych linii. Oto prawdziwy powód: kodowanie .
Amit Naidu

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

94

sed (i im podobne) są zawarte w kilku pakietach poleceń systemu Unix.

Jeś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ć sedwiersz 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

1
Nie jest to dokładnie to, czego chcę, ale wierzę, że zależność od VBS jest najlżejszym rozwiązaniem.
Jakub Šturc

7
GnuWin32 jest rozwiązaniem natywnym, jeśli przez natywne rozumiesz zaprojektowane do działania w „normalnym” środowisku Windows (w przeciwieństwie do CygWin). Spróbuj, a zaczniesz oczekiwać, że będą działać w KAŻDYM systemie Windows, którego używasz. !!!
Michael Paulukonis

3
Działa w moim przypadku! Nie zapomnij także o opcji cscript „// NoLogo”.
Marko Dumic

4
Jeśli to jest „z mankietu”, zastanawiaj się, jak wygląda twój drugi kod! Niesamowite, dzięki.
Sabuncu

2
Podobne narzędzie do wyszukiwania i zamiany wyrażeń regularnych można wykonać za pomocą języka JScript. Zaletą języka JScript w porównaniu z VBScript jest to, że można go łatwo połączyć z wsadowym w jednym skrypcie, dzięki czemu narzędzie jest łatwiejsze w użyciu w kontekście wsadowym lub wiersza poleceń. Dostępne jest solidne, hybrydowe narzędzie JScript / wsadowe o nazwie REPL.BAT . Posiada wiele opcji wiersza poleceń. Pełna dokumentacja jest osadzona w skrypcie. Z pewnością nie ma pełnej zdolności seda, ale mimo to jest dość potężny.
dbenham


17

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.


10

Istnieje Super Sed , ulepszona wersja seda. W przypadku systemu Windows jest to samodzielny plik .exe, przeznaczony do uruchamiania z wiersza poleceń.


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

To jest zachowanie

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

1
Działa doskonale. Uwaga: nawiasy na "get-content" zapewniają, że plik nie będzie używany później, gdy zostanie wywołana "set-content".
Kafu

czy coś podobnego jest możliwe w cmd? rozumiem, że dotyczy to tylko
pwsh

czy „SourceRegexp” ma być zastąpione przez jakiekolwiek możliwe wyrażenie regularne? czy to naprawdę działa w Power Shell?
scjorge

7

Możesz spróbować PowerShell. Istnieją wbudowane polecenia get-content i set-content , których można użyć.


4
To są prawdopodobnie dwie rzeczy w PowerShell, które w najmniejszym stopniu przyczyniają się do tego, co sedrobi ;-). -replaceOperator jest prawdopodobnie lepsza propozycja.
Joey

7

Spróbuj fart.exe. Jest to narzędzie do znajdowania i zastępowania tekstu, którego można używać w programach wsadowych poleceń.

http://sourceforge.net/projects/fart-it/


Jeśli naprawdę nie mogę użyć powłoki podobnej do * nix, wolę to, ponieważ jest to mały samodzielny exe bez żadnych zależności.
Qben


6

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).


4

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


5
Obie nie istnieją już w 64-bitowych wersjach systemu Windows.
Joey


3

Istnieje pomocniczy plik wsadowy dla systemu Windows o nazwie, repl.batktóry ma wiele możliwości SED, ale doesn't require any additional downloadlub instalacji. Jest to hybrydowy plik wsadowy, który wykorzystuje Jscriptdo implementacji funkcji i tak jest swift, a także doesn't suffer from the usual poison charactersprzetwarzania wsadowego i obsługuje z łatwością puste wiersze.

Pobierz replz - https://www.dropbox.com/s/qidqwztmetbvklt/repl.bat

Autorem jest @dbenham z stack overflow i dostips.com

Inny plik wsadowy pomocnika, o nazwie, findrepl.batdaje użytkownikowi systemu Windows wiele możliwości GREPi jest również oparty naJscript pliku wsadowym hybrydowym. Ma zalety repl.bat

Pobierz findreplz - https://www.dropbox.com/s/rfdldmcb6vwi9xc/findrepl.bat

Autorem jest @aacini z stack overflow i dostips.com


Łącze do skrzynki referencyjnej repl nie działa. Czy masz dodatkowe łącze?
Vishal Anand

2

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.


1

Cygwin działa, ale te narzędzia są również dostępne. Po prostu umieść je na dysku, umieść katalog w swojej ścieżce i masz wiele przyjaznych narzędzi uniksowych. Lżejszy IMHO, że Cygwin (chociaż to działa równie dobrze).


0

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 .


1
Pytanie dotyczy systemu Windows (cmd.exe), a nie DOS-a
a_horse_with_no_name

@royhowie: Rozumiem. Chociaż niektóre z tych odpowiedzi mogą być dla kogoś przydatne, zgadzam się, że samo pytanie nie jest odpowiednie dla SO. OTOH, nie czuję się kwalifikowany do rekomendowania usuwania hurtowego.
2:00 po południu

W tej sytuacji myślę, że byłoby trudno zawrzeć zasadnicze części odpowiedzi, ponieważ podstawową częścią jest plik .exe, który jest hostowany na połączonej stronie. Całkowicie rozumiem troskę o gnicie linków, po prostu nie jestem pewien, jak mogę to zrobić samodzielnie w SO.
bryan kennedy

Dzięki za połów, a_horse_with_no_name. Byłem niechlujny z moim językiem. Zmodyfikowałem swój komentarz, aby naprawić wskazany przez Ciebie problem.
bryan kennedy
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.