Cmd.exe için herhangi bir sed benzeri yardımcı program var mı? [kapalı]


157

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ı?


1
"Yerli" ile ne demek istiyorsun ??? Cmd.exe'de çalışmak veya herhangi bir kurulum olmadan çalışmak için kurulabilir mi? İlki ise, aşağıdaki GnuWin32 referansına bakın; ikincisi ise hayır. Windows için önceden yüklenmiş yerel sed yok.
Michael Paulukonis

6
Yerel derken, ek şeyler yüklemeden tüm pencerelerde çalışan çözümü kastettim.
Jakub Šturc

1
Cmd.exe'yi geride bırakın ve bunun yerine PowerShell'i kullanın.
Bill_Stewart


Bir dosyadan yalnızca belirli satırları silmek istiyorsanız, FIND /?
John Henckel

Yanıtlar:


123

Bugün powershell beni kurtardı.

Çünkü grepvar:

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

veya

select-string somefile.txt -pattern "expression"

ve için sedvar:

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

Daha fazla ayrıntı için Zain Naboulsis blog girişine bakın .


12
Ek olarak: normal cmd'den çağırmak isterseniz, @powershell -Command "get-content ..." komutunu verin. Tek uyarı, tırnak işaretlerinden kaçmanız gerektiğidir: ... -Command "get-content ... \" ifade \ ", ..."
Tarc

1
@Tarc AFAIR, komutunuzda tek tırnak işaretleri kullanabilir ve bunun yerine komutu alıntı yapmak için çift tırnak kullanabilirsiniz

2
Bunu bugün bir dosya üzerinde, belirli yerlerdeki alıntılar arasındaki bazı şeyleri kaldırmak için denedim, yalnızca çıktının orijinalinden neredeyse iki kat daha büyük bir dosya olduğunu keşfettim. Bunun nedeni, bu yöntemin dosyada satırsonlarının işlenme şeklini "\ n" yerine "\ r \ n" kullanacak şekilde değiştirmesiydi.
user132278

1
\ R \ n nedeniyle ikiye katlama, dosyanızın tamamen yeni satırlardan oluştuğu anlamına gelir. İşte gerçek neden: kodlama .
Amit Naidu

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

97

sed (ve türü) birçok Unix komut paketi içinde yer alır.

Herhangi 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 sedkomut 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

1
Bu tam olarak istediğim şey değil, ancak VBS'ye bağımlılığın en hafif çözüm olduğuna inanıyorum.
Jakub Šturc

7
GnuWin32 olan yerli tarafından size (CygWin aksine) "normal" Windows ortamında çalışacak şekilde tasarlanmıştır demek eğer, bir yerli çözüm. Bir deneyin ve kullandığınız HER Windows sisteminde olmasını beklemeye başlayacaksınız. !!!
Michael Paulukonis

3
Benim durumum için çalışıyor! Ayrıca, "// NoLogo" cscript seçeneğini de unutmayın.
Marko Dumic

4
Eğer bu "bilinçsiz" ise, diğer kodunuzun neye benzediğini merak edin! Şaşırtıcı, teşekkürler.
Sabuncu

2
Benzer bir normal ifade arama ve değiştirme aracı JScript ile yapılabilir. JScript'in VBScript'e göre avantajı, toplu iş ile tek bir komut dosyasında kolayca birleştirilebilmesi, yardımcı programın toplu iş veya komut satırı bağlamında kullanımını kolaylaştırmasıdır. REPL.BAT adında sağlam bir hibrit JScript / batch yardımcı programı mevcuttur . Birçok komut satırı seçeneğine sahiptir. Tam dokümantasyon, komut dosyasının içine yerleştirilmiştir. Kesinlikle tam sed kabiliyetine sahip değil, ama öyle olsa bile oldukça güçlü.
dbenham


18

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.


10

Sed'in geliştirilmiş bir versiyonu Super Sed var . Windows için bu, komut satırından çalıştırılması amaçlanan bağımsız bir .exe'dir.


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

Bu davranış

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

1
Mükemmel çalışıyor. Not: "get-content" üzerindeki parantez, dosyanın daha sonra "set-content" çağrılacağı zaman kullanılmamasını sağlar.
Kafu

cmd'de benzer bir şey mümkün mü? bunun sadece
pwsh

"SourceRegexp" herhangi bir olası normal ifade ile ikame edilecek mi? bu gerçekten güç kabuğunda çalışıyor mu?
scjorge

7

Powershell'i deneyebilirsin. Kullanabileceğiniz get-content ve set-content komutları bulunmaktadır.


4
Bunlar muhtemelen sed;-) ne yaptığına en az katkıda bulunan PowerShell'deki iki şeydir . -replaceOperatör muhtemelen daha iyi bir öneridir.
Joey

7

Fart.exe'yi deneyin. Bu, komut toplu iş programlarında kullanılabilen bir metin bul ve değiştir yardımcı programıdır.

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


Eğer gerçekten * nix benzeri bir kabuk kullanamıyorsam, bağımlılıkları olmayan küçük bir bağımsız exe olduğundan bunu tercih ederim.
Qben


6

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


4

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


5
Her ikisi de artık Windows'un 64 bit sürümlerinde mevcut değil.
Joey


3

Windows için repl.bat, SED ama doesn't require any additional downloadveya kurulum yeteneğinin çoğuna sahip olan bir yardımcı toplu iş dosyası var . Bu, Jscriptözellikleri uygulamak için kullanan swiftve doesn't suffer from the usual poison characterstoplu 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 GREPve aynı zamanda Jscripthibrit 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


Repl için dropbox bağlantısı çalışmıyor. İkincil bir bağlantınız var mı?
Vishal Anand

2

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.


1

Cygwin çalışır, ancak bu yardımcı programlar da mevcuttur. Sadece onları sürücünüze yerleştirin, dizini yolunuza koyun ve pek çok kullanışlı unix aracınız var. Cygwin'in hafif IMHO'su (aynı şekilde çalışmasına rağmen).


0

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 .


1
Soru Windows (cmd.exe) ile ilgili değil DOS hakkında
a_horse_with_no_name

@royhowie: Anlıyorum. Bu cevaplardan bazıları birileri için yararlı olsa da, sorunun kendisinin SO için gerçekten uygun olmadığına katılıyorum. OTOH, toptan silmeyi tavsiye edecek kalifiye hissetmiyorum.
PM 2Ring

Bu durumda cevabın temel kısımlarını dahil etmenin zor olacağını düşünüyorum, çünkü temel kısım bağlantılı sayfada barındırılan bir .exe dosyasıdır. Link-rot ile ilgili endişeyi tamamen anlıyorum, bunu SO'ya nasıl kendi kendine yeten hale getirebileceğimden emin değilim.
bryan kennedy

Yakaladığınız için teşekkürler, a_horse_with_no_name. Dilimle özensiz davranıyordum. Bahsettiğiniz sorunu çözmek için yorumumu düzenledim.
bryan kennedy
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.