มีโปรแกรม sed อย่างยูทิลิตี้สำหรับ cmd.exe หรือไม่? [ปิด]


149

ฉันต้องการแก้ไขเนื้อหาไฟล์โดยใช้โปรแกรมโดยใช้บรรทัดคำสั่ง windows ( cmd.exe ) ใน * ระวังมีsedสำหรับงานนี้ มีประโยชน์เทียบเท่าพื้นเมืองใน windows?


1
"native" แปลว่าอะไร สามารถติดตั้งเพื่อทำงานใน cmd.exe หรือทำงานโดยไม่ต้องติดตั้งใด ๆ หากอดีตดู GnuWin32 อ้างอิงด้านล่าง ถ้าหลังไม่มี ไม่มี sed ดั้งเดิมที่ติดตั้งไว้ล่วงหน้าสำหรับ windows
Michael Paulukonis

6
โดย native ฉันหมายถึงวิธีแก้ปัญหาที่ทำงานบน windows ทั้งหมดโดยไม่ต้องติดตั้งสิ่งเพิ่มเติม
Jakub Šturc

1
ทิ้ง cmd.exe ไว้ข้างหลังและใช้ PowerShell แทน
Bill_Stewart

ที่เกี่ยวข้อง: stackoverflow.com/questions/60034/…
AlikElzin-kilaka

หากคุณต้องการลบบางบรรทัดออกจากไฟล์ให้ใช้ FIND /?
John Henckel

คำตอบ:


117

วันนี้ PowerShell ช่วยฉัน

เพราะgrepมี:

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

หรือ

select-string somefile.txt -pattern "expression"

และsedมี:

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

สำหรับรายละเอียดเพิ่มเติมดูรายการบล็อก Zain Naboulsis


12
นอกจากนี้: หากคุณต้องการโทรจาก cmd ปกติเพียงแค่ @powershell -Command "get-content ... " ข้อแม้เดียวคือคุณต้องหลีกเลี่ยงเครื่องหมายคำพูด: ... -Command "get-content ... \" expression \ ", ... "
Tarc

1
@Tarc AFAIR คุณสามารถใช้เครื่องหมายอัญประกาศเดี่ยวในคำสั่งของคุณและใช้เครื่องหมายคำพูดคู่เพื่ออ้างอิงคำสั่งแทน

2
ฉันลองวันนี้ในไฟล์เพื่อลบบางสิ่งระหว่างเครื่องหมายคำพูดในบางแห่งเท่านั้นที่ค้นพบว่าผลลัพธ์เป็นไฟล์ที่มีขนาดใหญ่กว่าต้นฉบับเกือบสองเท่า เหตุผลดูเหมือนว่าวิธีนี้เปลี่ยนวิธีจัดการบรรทัดใหม่ในไฟล์เพื่อใช้ "\ r \ n" แทนที่จะเป็น "\ n"
user132278

1
การเพิ่มเป็นสองเท่าเนื่องจาก \ r \ n จะบอกเป็นนัยว่าไฟล์ของคุณประกอบด้วยบรรทัดใหม่หมดจด นี่คือเหตุผลที่แท้จริง: การเข้ารหัส
Amit Naidu

2
@ and-bri (รับเนื้อหา c: \ temp \ test.txt) .replace ('[MYID]', 'MyValue') | ชุดเนื้อหา c: \ temp \ test.txt
AFP_555

95

sed (และ ilk ของมัน) มีอยู่ในแพคเกจต่าง ๆ ของคำสั่ง Unix

  • Cygwin ใช้งานได้ แต่ใหญ่โต
  • UnxUtilsมีขนาดที่บางกว่ามาก
  • GnuWin32เป็นอีกพอร์ตหนึ่งที่ใช้งานได้
  • อีกหนึ่งทางเลือกของ AT & T วิจัยระบบ UWin
  • MSYSจาก MinGw เป็นอีกตัวเลือกหนึ่ง
  • Windows Subsystem สำหรับ Linuxเป็นตัวเลือก "ดั้งเดิม" ที่สุด แต่ไม่ได้ติดตั้งบน Windows ตามค่าเริ่มต้น มันมีsed, grepฯลฯ ออกจากกล่องแม้ว่า
  • https://github.com/mbuilov/sed-windowsเสนอรุ่น 4.3 และ 4.4 ล่าสุดซึ่งรองรับ-zตัวเลือกต่างจากพอร์ตบน

หากคุณไม่ต้องการติดตั้งอะไรและระบบของคุณไม่ใช่ Windows Server คุณสามารถใช้ภาษาสคริปต์ (VBScript เช่น) สำหรับสิ่งนั้น ด้านล่างนี้เป็นขั้นต้นแทงออกนอกข้อมือที่มัน บรรทัดคำสั่งของคุณจะเป็นอย่างไร

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

ที่ oldpat และ newpat มีMicrosoft VBScript รูปแบบ เห็นได้ชัดว่าฉันใช้คำสั่งทดแทนและคาดเดาบางสิ่งเท่านั้น แต่คุณสามารถทำให้มันฉลาดขึ้นและเข้าใจsedบรรทัดคำสั่งมากขึ้น

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
นี่ไม่ใช่สิ่งที่ฉันต้องการอย่างแน่นอน แต่ฉันเชื่อว่าการพึ่งพา VBS เป็นวิธีที่เบาที่สุด
Jakub Šturc

7
GnuWin32 เป็นวิธีแก้ปัญหาแบบเนทีฟถ้าโดยพื้นฐานคุณได้รับการออกแบบให้ทำงานในสภาพแวดล้อมหน้าต่าง "ปกติ" (ไม่เหมือน CygWin) ลองพวกเขาและคุณจะเริ่มคาดหวังว่าพวกเขาจะอยู่ในทุกระบบ windows ที่คุณใช้ !!!
Michael Paulukonis

3
ใช้งานได้กับกรณีของฉัน! นอกจากนี้อย่าลืมตัวเลือก "// NoLogo" cscript
Marko Dumic

4
หากนี่เป็น "ข้อมือ" ให้สงสัยว่ารหัสอื่นของคุณเป็นอย่างไร น่าทึ่งขอบคุณ
Sabuncu

2
การค้นหาและแทนที่ยูทิลิตี regex ที่คล้ายกันสามารถทำได้ด้วย JScript ข้อดีของ JScript บน VBScript คือสามารถรวมเข้ากับแบทช์ในสคริปต์เดียวได้อย่างง่ายดายทำให้ยูทิลิตี้ใช้งานง่ายขึ้นในแบทช์หรือบริบทบรรทัดคำสั่ง ยูทิลิตี้ JScript / ชุดไฮบริดที่มีประสิทธิภาพเรียกว่า REPL.BAT ใช้ได้ มันมีตัวเลือกบรรทัดคำสั่งมากมาย เอกสารแบบเต็มจะถูกฝังอยู่ภายในสคริปต์ แน่นอนมันไม่ได้มีความสามารถเต็มที่ แต่ถึงกระนั้นมันก็ค่อนข้างมีประสิทธิภาพ
dbenham


17

หากคุณไม่ต้องการติดตั้งอะไร (ฉันคิดว่าคุณต้องการเพิ่มสคริปต์ลงในโซลูชัน / โปรแกรม / ฯลฯ ที่จะทำงานในเครื่องอื่น ๆ ) คุณสามารถลองสร้างสคริปต์ vbs (สมมติว่า 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

และคุณเรียกใช้เช่นนี้:

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

ซึ่งคล้ายกับเวอร์ชั่น sed ที่จัดทำโดย "bill weaver" แต่ฉันคิดว่าอันนี้เป็นมิตรมากกว่าในแง่ของอักขระพิเศษ ('> </)

Btw ฉันไม่ได้เขียนสิ่งนี้ แต่ฉันจำไม่ได้ว่ามาจากไหน



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

นี่คือพฤติกรรมของ

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

1
มันทำงานได้อย่างสมบูรณ์ หมายเหตุ: วงเล็บใน "get-content" ให้แน่ใจว่าไฟล์จะไม่ถูกใช้งานในภายหลังเมื่อจะเรียก "set-content"
Kafu

สิ่งที่คล้ายกันเป็นไปได้ใน cmd? ในการทำความเข้าใจนี้มีไว้สำหรับ pwsh เท่านั้น
Ferroao

คือ 'SourceRegexp' ที่จะถูกแทนที่ด้วย regex ที่เป็นไปได้หรือไม่ มันใช้งานได้จริงใน power shell?
scjorge

7

คุณสามารถลองใช้ PowerShell มีคำสั่งget-contentและset-contentที่คุณสามารถใช้ได้


4
สิ่งเหล่านี้น่าจะเป็นสองสิ่งใน PowerShell ที่มีส่วนสำคัญอย่างน้อยต่อสิ่งที่sed;-) -replaceประกอบการน่าจะเป็นข้อเสนอแนะที่ดีกว่า
Joey

7

ลอง fart.exe มันเป็นยูทิลิตี้ค้นหาและแทนที่ข้อความที่สามารถใช้ในโปรแกรมชุดคำสั่ง

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


ถ้าฉันไม่สามารถใช้ * ระวังเช่นเชลล์ฉันชอบสิ่งนี้เพราะมันเป็น exe แบบสแตนด์อโลนขนาดเล็กที่ไม่มีการพึ่งพา
Qben


6

ผมใช้Cygwin ฉันพบเจอคนจำนวนมากที่ไม่ทราบว่าถ้าคุณวาง Cygwin ไบนารีไว้ใน PATH ของคุณคุณสามารถใช้พวกมันจากภายในเชลล์คำสั่งของ Windows คุณไม่จำเป็นต้องเรียกใช้ Bash ของ Cygwin

คุณอาจมองหาบริการ Windows สำหรับ Unixจาก Microsoft (เฉพาะในรุ่น Professional และ Windows รุ่นที่สูงกว่า)


4

edlin หรือแก้ไข

รวมถึงมีบริการ Windows สำหรับ Unix ซึ่งมาพร้อมกับเครื่องมือ unix มากมายสำหรับ windows http://technet.microsoft.com/en-us/interopmigration/bb380242.aspx

อัปเดต 12/7/12 ใน Windows 2003 R2, Windows 7 & Server 2008 ฯลฯ ข้างต้นจะถูกแทนที่ด้วยระบบย่อยสำหรับแอปพลิเคชันที่ใช้ UNIX (SUA) เป็นส่วนเสริม แต่คุณต้องดาวน์โหลดโปรแกรมอรรถประโยชน์: http://www.microsoft.com/en-us/download/details.aspx?id=2391


5
ทั้งสองไม่มีอยู่อีกต่อไปบน Windows รุ่น 64 บิต
Joey


3

มีไฟล์ชุดผู้ช่วยสำหรับ Windows ที่เรียกว่าrepl.batซึ่งมีความสามารถในการ SED มากdoesn't require any additional downloadหรือการติดตั้ง มันเป็นไฟล์แบตช์ไฮบริดที่ใช้Jscriptในการใช้คุณสมบัติและอื่น ๆswiftและdoesn't suffer from the usual poison charactersการประมวลผลแบทช์และจัดการกับบรรทัดว่างได้อย่างง่ายดาย

ดาวน์โหลดreplจาก - https://www.dropbox.com/s/qidqwztmetbvklt/repl.bat

ผู้เขียนคือ @dbenham จาก stack overflow และ dostips.com

ไฟล์แบตช์ตัวช่วยอื่นที่เรียกว่าfindrepl.batช่วยให้ผู้ใช้ Windows มีความสามารถมากGREPและเป็นไปตามJscriptและเป็นเช่นเดียวกันกับไฟล์แบตช์ไฮบริด มันแบ่งปันผลประโยชน์ของ repl.bat

ดาวน์โหลดfindreplจาก - https://www.dropbox.com/s/rfdldmcb6vwi9xc/findrepl.bat

ผู้เขียนคือ @aacini จาก stack overflow และ dostips.com


ลิงก์ดรอปบ็อกซ์สำหรับการเรพลิเคตไม่ทำงาน คุณมีลิงค์สำรองหรือไม่?
Vishal Anand

2

เท่าที่ฉันรู้ว่าไม่มีอะไรเหมือน sed มาพร้อมกับหน้าต่าง อย่างไรก็ตาม sed สามารถใช้งานได้กับ Windows ในหลายรูปแบบรวมถึงเป็นส่วนหนึ่งของ Cygwin หากคุณต้องการระบบย่อย POSIX เต็มรูปแบบหรือเป็น Win32 ดั้งเดิมที่สามารถเรียกใช้งานได้หากคุณต้องการเรียกใช้เพียงบรรทัดคำสั่ง

Sed สำหรับ Windows (โครงการ GnuWin32)

ถ้ามันจำเป็นต้องเป็น Native ของ Windows สิ่งอื่น ๆ ที่ฉันสามารถแนะนำได้ก็คือการใช้ภาษาสคริปต์ที่ Windows รองรับโดยไม่มีโปรแกรมเสริมเช่น VBScript


1

Cygwin ใช้งานได้ แต่ยูทิลิตี้เหล่านี้ยังมีอยู่ เพียงแค่เสียบเข้ากับไดรฟ์วางไดเรกตอรีเข้าไปในเส้นทางของคุณและคุณมียูทิลิตี้ยูนิกซ์ที่เป็นมิตร ไฟแช็ก IMHO นั้น Cygwin (แม้ว่ามันจะใช้ได้ดีเหมือนกัน)


0

ฉันต้องการเครื่องมือ sed ที่ใช้งานได้กับพรอมต์ Windows cmd.exe พอร์ตsedของ Eric Pement ไปยัง DOS .exe เดียวทำงานที่ดีสำหรับฉัน

มันสวยดีเอกสาร


1
คำถามเกี่ยวกับWindows (cmd.exe) ไม่เกี่ยวกับ DOS
a_horse_with_no_name

@royhowie: ฉันเห็น แม้ว่าบางคำตอบเหล่านี้อาจเป็นประโยชน์กับบางคน แต่ฉันยอมรับว่าคำถามนั้นไม่เหมาะสำหรับ SO OTOH ฉันไม่รู้สึกว่ามีคุณสมบัติที่จะแนะนำการลบแบบขายส่ง
PM 2Ring

ในสถานการณ์เช่นนี้ฉันคิดว่ามันยากที่จะรวมส่วนสำคัญของคำตอบเนื่องจากส่วนสำคัญคือไฟล์. exe ที่โฮสต์ในหน้าเชื่อมโยง ฉันเข้าใจความกังวลทั้งหมดเกี่ยวกับ link-rot ฉันแค่ไม่แน่ใจว่าฉันจะทำให้เรื่องนี้เป็นเรื่องของตัวเองได้อย่างไร
bryan kennedy

ขอบคุณสำหรับการจับ a_horse_with_no_name ฉันเป็นคนเลอะเทอะด้วยภาษาของฉัน ฉันแก้ไขความคิดเห็นของฉันเพื่อแก้ไขปัญหาที่คุณชี้ให้เห็น
bryan kennedy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.