Có bất kỳ tiện ích như sed cho cmd.exe không? [đóng cửa]


149

Tôi muốn lập trình chỉnh sửa nội dung tệp bằng dòng lệnh windows ( cmd.exe ). Trong * nix có sed cho nhiệm vụ này. Có bất kỳ tương đương bản địa hữu ích trong các cửa sổ?


1
Bạn có ý nghĩa gì bởi "bản địa" ??? Có thể cài đặt để làm việc trong cmd.exe, hoặc để làm việc mà không cần cài đặt gì? Nếu trước đây, hãy xem GnuWin32 ref'd bên dưới; nếu sau này, không. Không có sed gốc cài đặt sẵn cho các cửa sổ.
Michael Paulukonis

6
Theo bản địa tôi có nghĩa là giải pháp chạy trên tất cả các cửa sổ mà không cần cài đặt thêm.
Jakub turc

1
Để lại cmd.exe và sử dụng PowerShell thay thế.
Bill_Stewart


Nếu bạn chỉ muốn xóa một số dòng nhất định khỏi một tệp, sử dụng TÌM /?
John Henckel

Câu trả lời:


117

Hôm nay powershell đã cứu tôi.

grepcó:

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

hoặc là

select-string somefile.txt -pattern "expression"

và vì sedcó:

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

Để biết thêm chi tiết, xem mục blog của Zain Naboulsis .


12
Ngoài ra: nếu bạn muốn gọi nó từ cmd bình thường, chỉ cần @powershell -Command "get-content ..." nó.
Nhắc nhở

1
@Tarc AFAIR, bạn có thể sử dụng dấu ngoặc đơn trong lệnh của mình và sử dụng dấu ngoặc kép để trích dẫn lệnh thay thế

2
Tôi đã thử điều này ngày hôm nay trên một tệp để loại bỏ một số nội dung giữa các trích dẫn ở một số nơi nhất định, chỉ để phát hiện ra rằng đầu ra là một tệp lớn gần gấp đôi so với ban đầu. Lý do có vẻ là phương pháp này đã thay đổi cách xử lý các dòng mới trong tệp để sử dụng "\ r \ n" thay vì "\ n".
user132278

1
Nhân đôi do \ r \ n sẽ ngụ ý rằng tệp của bạn được tạo hoàn toàn bằng các dòng mới. Đây là lý do thực sự: mã hóa .
Amit N Nikol

2
@ và-bri (Nhận nội dung c: \ temp \ test.txt) .replace ('[MYID]', 'MyValue') | Đặt nội dung c: \ temp \ test.txt
AFP_555

94

sed (và ilk của nó) được chứa trong một số gói lệnh Unix.

Nếu bạn không muốn cài đặt bất cứ thứ gì và hệ thống của bạn không phải là Windows Server, thì bạn có thể sử dụng ngôn ngữ kịch bản (ví dụ VBScript) cho điều đó. Dưới đây là một cú đâm thô thiển vào nó. Dòng lệnh của bạn sẽ giống như

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

trong đó oldpat và newpat là các mẫu biểu thức vbscript của Microsoft . Rõ ràng là tôi chỉ thực hiện lệnh thay thế và giả định một số điều, nhưng bạn có thể xác định nó để thông minh hơn và hiểu nhiều hơn về dòng sedlệnh.

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
Đây không phải là chính xác những gì tôi muốn tuy nhiên tôi tin rằng sự phụ thuộc vào VBS là giải pháp nhẹ nhất.
Jakub Šturc

7
GnuWin32 một giải pháp riêng, nếu theo bản địa, bạn có nghĩa là được thiết kế để chạy trong môi trường cửa sổ "bình thường" (không giống như CygWin). Hãy thử cho họ và bạn sẽ bắt đầu mong đợi họ ở trên MỌI hệ thống cửa sổ bạn sử dụng. !!!
Michael Paulukonis

3
Hoạt động cho trường hợp của tôi! Ngoài ra, đừng quên tùy chọn cscript "// NoLogo".
Marko Dumic

4
Nếu đây là "ngoài lề", hãy tự hỏi mã khác của bạn trông như thế nào! Thật tuyệt vời, cảm ơn.
Sabuncu

2
Một tiện ích tìm kiếm và thay thế regex tương tự có thể được thực hiện với JScript. Ưu điểm của JScript so với VBScript là có thể dễ dàng kết hợp với lô trong một tập lệnh, giúp tiện ích dễ sử dụng hơn trong ngữ cảnh hàng loạt hoặc dòng lệnh. Một tiện ích JScript / batch lai mạnh mẽ có tên REPL.BAT có sẵn . Nó có nhiều tùy chọn dòng lệnh. Tài liệu đầy đủ được nhúng trong tập lệnh. Nó chắc chắn không có khả năng sed đầy đủ, nhưng ngay cả như vậy, nó khá mạnh mẽ.
dbenham


17

Nếu bạn không muốn cài đặt bất cứ thứ gì (tôi giả sử bạn muốn thêm tập lệnh vào một số giải pháp / chương trình / vv sẽ được chạy trong các máy khác), bạn có thể thử tạo tập lệnh vbs (giả sử, thay thế.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

Và bạn chạy nó như thế này:

cscript replace.vbs "C:\One.txt" "Robert" "Rob"

Tương tự như phiên bản sed được cung cấp bởi "thợ dệt hóa đơn", nhưng tôi nghĩ phiên bản này thân thiện hơn về các ký tự đặc biệt ('> </).

Btw, tôi đã không viết nó, nhưng tôi không thể nhớ tôi đã lấy nó từ đâu.


10

Super Sed một phiên bản nâng cao của sed. Đối với Windows, đây là một .exe độc ​​lập, dành cho việc chạy từ dòng lệnh.


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

Đây là hành vi của

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

1
Nó hoạt động hoàn hảo. Lưu ý: dấu ngoặc đơn trên "get-content" đảm bảo rằng tệp sẽ không được sử dụng sau này khi "set-content" sẽ được gọi.
Kafu

là một cái gì đó tương tự có thể trong cmd? để hiểu điều này chỉ dành cho pwsh
Ferroao

là 'SourceRegapi' có thể được thay thế bởi bất kỳ biểu thức chính quy nào không? Điều đó thực sự hoạt động trong vỏ điện?
scjorge

7

Bạn có thể thử powershell. Có các lệnh lệnh get-contentset-content mà bạn có thể sử dụng.


4
Đó có lẽ là hai điều trong PowerShell đóng góp ít nhất vào những gì sed;-). Các -replacenhà điều hành có lẽ là một gợi ý tốt hơn.
Joey

7

Hãy thử fart.exe. Đây là một tiện ích văn bản Tìm và thay thế có thể được sử dụng trong các chương trình bó lệnh.

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


Nếu tôi thực sự không thể sử dụng shell * nix, tôi thích cái này vì nó là một exe độc ​​lập nhỏ không có phụ thuộc.
Qben


6

Tôi sử dụng Cygwin . Tôi gặp rất nhiều người không nhận ra rằng nếu bạn đặt các nhị phân Cygwin trên PATH của mình, bạn có thể sử dụng chúng từ trong vỏ Windows Command. Bạn không phải chạy Bash của Cygwin.

Bạn cũng có thể xem xét Dịch vụ Windows cho Unix có sẵn từ Microsoft (nhưng chỉ trên các phiên bản Windows chuyên nghiệp và cao hơn).


4

edlin hoặc chỉnh sửa

Ngoài ra, còn có Windows Services cho Unix đi kèm với nhiều công cụ unix cho windows. http://technet.microsoft.com/en-us/interopmigration/bb380242.aspx

Cập nhật 12/7/12 Trong Windows 2003 R2, Windows 7 & Server 2008, v.v., phần trên được thay thế bởi Hệ thống con cho các ứng dụng dựa trên UNIX (SUA) dưới dạng một tiện ích bổ sung. Nhưng bạn phải tải xuống các tiện ích: http://www.microsoft.com/en-us/doad/details.aspx?id=2391


5
Cả hai không tồn tại nữa trên các phiên bản Windows 64 bit.
Joey

3

Bạn có thể nhìn vào GNU Tools , họ cung cấp (trong số những thứ khác) sed trên windows.


3

Có một tệp bó trợ giúp cho Windows được gọi là repl.batcó nhiều khả năng của SED nhưng doesn't require any additional downloadhoặc cài đặt. Đây là một tệp bó kết hợp sử dụng Jscriptđể thực hiện các tính năng và cũng vậy swift, vàdoesn't suffer from the usual poison characters chế biến hàng loạt và xử lý dòng trống một cách dễ dàng.

Tải xuống repltừ - https://www.dropbox.com/s/qidqwztmetbvklt/repl.bat

Tác giả là @dbenham từ stack overflow và dostips.com

Một tệp bó trợ giúp khác được gọi là findrepl.batcung cấp cho người dùng Windows phần lớn khả năng GREPvà cũng dựa trênJscript và tương tự như vậy là một tệp bó lai. Nó chia sẻ những lợi ích của repl.bat

Tải xuống findrepltừ - https://www.dropbox.com/s/rfdldmcb6vwi9xc/findrepl.bat

Tác giả là @aacini từ stack stack và dostips.com


Liên kết dropbox để thay thế là xuống. Bạn có một liên kết phụ?
Vishal Anand

2

Theo tôi biết không có gì giống như sed được đóng gói với các cửa sổ. Tuy nhiên, sed có sẵn cho Windows ở một số dạng khác nhau, bao gồm cả một phần của Cygwin, nếu bạn muốn có một hệ thống con POSIX đầy đủ hoặc dưới dạng thực thi riêng của Win32 nếu bạn chỉ muốn chạy sed trên dòng lệnh.

Sed cho Windows (Dự án GnuWin32)

Nếu nó cần phải có nguồn gốc từ Windows thì điều khác duy nhất tôi có thể đề xuất là sử dụng ngôn ngữ kịch bản được Windows hỗ trợ mà không cần tiện ích bổ sung, chẳng hạn như VBScript.


1

Cygwin hoạt động, nhưng những tiện ích này cũng có sẵn. Chỉ cần đặt chúng trên ổ đĩa của bạn, đặt thư mục vào đường dẫn của bạn và bạn có nhiều tiện ích unix thân thiện. Nhẹ hơn IMHO mà Cygwin (mặc dù điều đó cũng hoạt động tốt).


0

Tôi cần một công cụ sed hoạt động cho dấu nhắc cmd.exe của Windows. Cổng sed của Eric Pement cho một DOS .exe hoạt động rất tốt đối với tôi.

Đó là tài liệu khá tốt .


1
Câu hỏi là về Windows (cmd.exe) không phải về DOS
a_horse_with_no_name

@royhowie: Tôi hiểu rồi. Mặc dù một số câu trả lời này có thể hữu ích cho ai đó, tôi đồng ý rằng bản thân câu hỏi không thực sự phù hợp với SO. OTOH, tôi không cảm thấy đủ điều kiện để đề nghị xóa bán buôn.
PM 2Ring

Trong tình huống này, tôi nghĩ rằng sẽ rất khó để bao gồm các phần thiết yếu của câu trả lời, vì phần thiết yếu là một tệp .exe được lưu trữ trên trang được liên kết. Tôi hoàn toàn hiểu nỗi lo về thối liên kết, tôi chỉ không chắc làm thế nào tôi có thể tự làm điều này với SO.
bryan kennedy

Cảm ơn bạn đã bắt, a_horse_with_no_name. Tôi đã bị cẩu thả với ngôn ngữ của tôi. Tôi chỉnh sửa bình luận của tôi để khắc phục vấn đề bạn chỉ ra.
bryan kennedy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.