Regex แทนที่จากบรรทัดคำสั่ง


21

เป็นไปได้ไหมที่ regex จะถูกแทนที่จาก command line? ตอนนี้ฉันใช้ notepad ++ เพื่อทำสิ่งนี้ ในบรรทัดคำสั่งฉันสามารถใช้ FINDSTR ซึ่งสามารถค้นหาไฟล์ / บรรทัด mached เท่านั้น

แก้ไข:
อาจเป็นไปได้ไหมที่จะสร้างสคริปต์ VB และเรียกใช้จาก cmd? ฉันเพิ่งสร้างไฟล์ "hi.vbs" พร้อมเนื้อหา

Msgbox "Hi Buddy"

จากนั้น cmd อนุญาตให้ฉันเรียกใช้โดยตรงโดยพิมพ์ "hi" จากบรรทัดคำสั่ง
ดังนั้นถ้ามันเป็นไปไม่ได้กับชุดสคริปต์แล้วฉันอาจใช้ชุดรางสคริปต์ VB หรือ..?


ในตอนท้ายคุณใส่ประโยคที่สรุปไม่ได้และส่วนการแก้ไขทั้งหมดไม่ได้ชี้ไปที่ปัญหาเป็นเช่น "ฉันสร้างโลกสวัสดีใน vb ฉันจะสร้างสิ่งที่อยู่ในชุดได้หรือไม่ตรวจสอบคำตอบที่โพสต์โดย @IanPugsley วิธีง่ายๆในการเปลี่ยน regex
mjsr

@Aziz: คำตอบใด ๆ ที่ได้ผลสำหรับคุณ ถ้าเป็นเช่นนั้นคุณจะยอมรับหรือไม่ นั่นเป็นส่วนหนึ่งของการมีส่วนร่วมในชุมชนนี้ วิธีที่เราขอบคุณซึ่งกันและกันเพื่อขอความช่วยเหลือ คะแนนชื่อเสียงที่ให้ไว้สำหรับคำตอบที่ยอมรับได้ช่วยให้ผู้ใช้รายอื่นประเมินประสบการณ์ของอีกฝ่าย ขอบคุณ
JRobert

ฉันคิดว่าจะเรียกบางอย่างเช่น MYVBREPLACE (.vbs) FILENAME REGEXPATTERN REPLACEMENT จากบรรทัดคำสั่ง
Aziz

คำตอบ:


11

ไปที่นี่
http://gnuwin32.sourceforge.net/packages.html
เลื่อนลงไปที่ SED ดาวน์โหลด coreutils ด้วยในขณะที่คุณอยู่ในนั้น

คำสั่งนี้จะแทนที่ a ด้วย b ทั่วโลกและในแต่ละบรรทัด ดังนั้นไม่ใช่แค่การเกิดขึ้นครั้งแรกในบรรทัด

เช่นใช้ sed "s / a / b / g" a.txt

C:\>type a.txt
aaaa
aaa

C:\>sed "s/a/b/" a.txt
baaa
baa

C:\>sed "s/a/b/g" a.txt
bbbb
bbb

C:\>

VBScript รองรับการแสดงผลปกติคุณสามารถค้นหาและแทนที่ด้วย

dim re, s
set re = new RegExp

re.Pattern="in"
re.Global=True 'false is default
s="bin din in"
MsgBox re.Replace(s,"xxx")

แสดง bxxx dxxx xxx


เครื่องมือบ้าสุดยอด !!! เครื่องมือนี้ adwanced มากเกินไป ฉันยังไม่สามารถใช้งานได้ แต่เมื่อฉันอ่านgnu.org/software/sed/manual/sed.html#The-_0022s_0022-Commandฉันเห็นว่าสิ่งนี้สามารถทำได้มากกว่าที่ฉันคาดไว้ ขอบคุณมาก
Aziz

เวอร์ชันใหม่ของ bash ยังสามารถแสดงผลปกติบางครั้งก็เพียงพอสำหรับงานที่เรียบง่ายและไม่จำเป็นต้องใช้แม้แต่เรื่องง่าย
vtest

และสิ่งที่ vtest พูดในกรณีที่ไม่มีใครรู้ cygwin มีการทุบตี
barlop

sed ดูดด้วยการแทนที่แบบหลายบรรทัด
kofifus

1
@KennyEvitt cmd เปลือกต้องบิดจะได้รับมันในการแสดงและการใช้งานของ chcp สำหรับ Unicode utf8 chcp 65001 (ตามที่คุณพูดว่า UTF16 encoding.chcp 1200 chcp 12001 ไม่ได้รับการสนับสนุน) stackoverflow.com/questions/9321419/... ไม่แน่ใจอีกครั้ง mintty ไม่แน่ใจ PowerShell อีกครั้ง แต่รองรับ utf-8 ก็โอเคใน cmd หรือ powershell ตราบใดที่มีการใช้ฟอนต์ที่รองรับเช่น courier ใหม่และตราบใดที่มันเป็นเพจรหัส 65001 มี cmd / u สำหรับการเข้ารหัส utf16
barlop

26

ฉันเขียนเครื่องมือบรรทัดคำสั่งฟรีสำหรับ Windows เพื่อทำสิ่งนี้ มันเรียกว่าrxreplรองรับการค้นหา Unicode และไฟล์ บางคนอาจพบว่าเป็นเครื่องมือที่มีประโยชน์

rxrepl เป็นเครื่องมือบรรทัดคำสั่งของ Microsoft Windows เพื่อค้นหาและแทนที่ข้อความในไฟล์ข้อความโดยใช้ Perl ปกติที่เข้ากันได้ (PCRE)

มันมีคุณสมบัติดังต่อไปนี้:

  • ค้นหาโดยใช้นิพจน์ปกติที่เข้ากันได้ของ Perl
  • ใช้การจับคู่กลุ่มในการแทนที่ข้อความ
  • รองรับการสิ้นสุดบรรทัด Windows และ Unix
  • รองรับ Unicode
  • ยอมรับข้อโต้แย้งการค้นหา / แทนที่หลายรายการ
  • ตัวเลือกอาจมีให้ในไฟล์ตัวเลือก
  • สแกนหาไฟล์
  • โหมดแสดงตัวอย่าง
  • บรรทัดและโหมดการจับคู่ไฟล์เต็มรูปแบบ

ป้อนคำอธิบายรูปภาพที่นี่


4
นี่มันอัศจรรย์มาก! หากคุณต้องการฉันและต้องการตัวอย่างสิ่งนี้แทนที่ "foobar" กับ "foofighters" ในไฟล์: rxrepl.exe -f file.txt -a -s "(foo) บาร์" -r "\ 1fighters"
Dunc

1
นอกจากนี้คุณจะมีแหล่งที่มาของบางอย่างเช่น GitHub หรือไม่? เข้าใจได้อย่างสมบูรณ์ถ้าไม่ได้หมายถึงโอเพนซอร์ส แต่ฉันอยากรู้อยากเห็นมาก
kayleeFrye_onDeck

1
@Steztric จริงเหรอ? ฉันใช้ Windows 64 บิตและดูเหมือนว่าไม่มีปัญหาในการเรียกใช้จากC:\WINDOWS\System32\cmd.exe
kayleeFrye_onDeck

1
เครื่องมือสุดยอด! ทำงานได้อย่างไม่มีปัญหาภายใต้ Windows Server Std 2012 R2 x64 ขอบคุณ!
kwrl

2
เครื่องมือที่ยอดเยี่ยมฉันหวังว่าคุณจะยังคงรักษามันไว้
น้ำ

12

Guy Scripting ครอบคลุมวิธีการทำเช่นนี้ใน PowerShell (ไม่มีการดาวน์โหลดเพิ่มเติมในระบบปฏิบัติการ Windows ล่าสุดคุณอาจติดตั้งไว้แล้ว)

เริ่มต้นขึ้นเรียกใช้สิ่งต่อไปนี้ (เพื่อแทนที่*ด้วย a @):

(Get-Content C:\Scripts\Test.txt) | 
Foreach-Object {$_ -replace "\*", "@"} | 
Set-Content C:\Scripts\Test.txt

สิ่งนี้รองรับการแสดงออกปกติ. NETรวมถึงการมองในแง่บวกและเชิงลบและทุกสิ่งที่ notepad ++ ไม่สนับสนุน regex ก่อนรุ่น 6.x (เท่าที่ฉันรัก notepad ++)


1
Notepad ++ รองรับ PCRE เต็มรูปแบบจากเวอร์ชัน 6
Bob

5

ฉันพบfnr.exeแล้ว มันมี GUI และบรรทัดคำสั่ง

เครื่องมือโอเพนซอร์สเพื่อค้นหาและแทนที่ข้อความในหลายไฟล์

คุณสมบัติ

  • ดาวน์โหลดไฟล์เดียว - fnr.exe (127kb)
  • แทนที่ข้อความในหลาย ๆ ไฟล์โดยใช้ windows application หรือผ่านทางบรรทัดคำสั่ง
  • ค้นหาเฉพาะเพื่อดูว่าพบการแข่งขันที่ไหน
  • การค้นหาแบบตรงตามตัวพิมพ์ใหญ่ - เล็ก
  • ค้นหาไฟล์ในไดเรกทอรีเดียวหรือเรียกค้นไดเรกทอรีย่อยซ้ำ
  • นิพจน์ทั่วไป
  • ค้นหาและแทนที่ข้อความหลายบรรทัด
  • สร้างปุ่มบรรทัดคำสั่งเพื่อสร้างข้อความบรรทัดคำสั่งเพื่อใส่ในไฟล์แบตช์
  • ความช่วยเหลือของบรรทัดคำสั่ง
  • การทดสอบหน่วยของเครื่องมือค้นหา / แทนที่

การดูตัวเลือกบรรทัดคำสั่ง

ป้อนคำอธิบายรูปภาพที่นี่


1
ค่อนข้างดี - คุณสามารถตรวจสอบคำสั่ง "ค้นหา" ใน GUI คลิก "Gen Replace Command Command" และเตรียมพร้อมที่จะใช้การเรียกบรรทัดคำสั่ง ไม่จำเป็นต้องใช้เวลาในการทำความคุ้นเคยกับไวยากรณ์บรรทัดคำสั่ง
sarh

ฉันไม่สามารถจัดการให้มันจบได้หลังจากทำการเปลี่ยนแปลง ฉันต้องกด Enter เพื่อปิดซึ่งไม่เป็นประโยชน์อย่างยิ่งสำหรับการเขียนสคริปต์
G-

@ G- ไม่มีการรอ <enter> ถ้ามันถูกเรียกใช้จากแบตช์ไฟล์
Sergius

ฉันไม่สามารถหาวิธีส่งออกไปยังชื่อไฟล์ / นามสกุลอื่นได้
Rick

4

ดูเหมือนว่าคุณสามารถใช้ regex กับ FINDSTR

findstr [Windows CMD] :

findstr อนุญาตให้ค้นหาข้อความ (ตามที่ระบุด้วยรูปแบบในไฟล์ชื่อไฟล์หากชื่อไฟล์มีอักขระตัวแทน (* หรือ?) จะค้นหาในไฟล์ทั้งหมดที่ตรงกับตัวเลือก / S ค้นหาในไดเรกทอรีปัจจุบันเช่นเดียวกับ ในไดเรกทอรีย่อยหากรูปแบบมีช่องว่างจะต้องระบุเช่น / C: "ข้อความบางส่วนที่จะค้นหา" เพื่อเปลี่ยนรูปแบบเป็นนิพจน์ทั่วไปต้องใช้ตัวเลือก / R ตัวเลือก / I จะค้นหากรณี ตายด้าน

จากความช่วยเหลือของ FindStr ( Findstr /?):

/ R - ใช้สตริงการค้นหาเป็นนิพจน์ทั่วไป

Regular expression quick reference:
  .        Wildcard: any character
  *        Repeat: zero or more occurrences of previous character or class
  ^        Line position: beginning of line
  $        Line position: end of line
  [class]  Character class: any one character in set
  [^class] Inverse class: any one character not in set
  [x-y]    Range: any characters within the specified range
  \x       Escape: literal use of metacharacter x
  \<xyz    Word position: beginning of word
  xyz\>    Word position: end of word

ขอบคุณสำหรับคำตอบของคุณ แต่นี่ไม่ใช่คำถามของฉัน
Aziz

2
findstrไม่สามารถแทนที่ข้อความในไฟล์ได้!
Kenny Evitt

4

ฉันมาช้าไปงานปาร์ตี้ แต่JREPL.BAT เป็นยูทิลิตี้ regex แบบ JScript / batch scriptที่ทำงานบนเครื่อง Windows เครื่องใดก็ได้ตั้งแต่ XP เป็นต้นไป

เอกสารแบบเต็มถูกสร้างไว้ในสคริปต์ซึ่งสามารถเข้าถึงได้ผ่านทางJREPL /?หรือใช้JREPL /??สำหรับการส่งออกเพจ

JREPL ใช้ ECMA regex มาตรฐานที่มาพร้อมกับ JScript ECMA regex มีประสิทธิภาพไม่มากพอ ๆ กับ. NET regex ที่มีให้กับ powershell แต่ก็ยังค่อนข้างดีอยู่ดี และฉันคิดว่าผู้ใช้โดยเฉลี่ยจะพบว่ายูทิลิตีนี้ใช้งานง่ายกว่าพาวเวอร์เชล

ตัวเลือก JREPL ในตัวให้พลังงานที่มีอยู่แล้วในตัว แต่ความสามารถในการฉีดสารที่ผู้ใช้จัดหาให้ JScript นั้นเปิดโอกาสที่น่าอัศจรรย์อย่างแท้จริง

ฉันพัฒนาสคริปต์เพราะที่ทำงานของฉันไม่อนุญาตให้ดาวน์โหลดไฟล์ exe ที่ไม่ได้มาตรฐาน แต่ไม่มีข้อ จำกัด ในการเขียนแบทช์หรือสคริปต์ JScript :-)

เพียงไปที่ลิงก์และคัดลอกรหัสสคริปต์ลงในไฟล์ชื่อ JREPL.BAT อ่านโพสต์ที่ตามมาจากหัวข้อนั้นสำหรับตัวอย่างของการใช้งานและประวัติการพัฒนา นอกจากนี้ยังมีคำตอบ StackOverflow มากมายที่ใช้ JREPL.BAT


3

สองตัวเลือกที่ดีคือCygwinซึ่งจะให้สภาพแวดล้อมแบบ Unix เหมือนทุบตี (ทางเลือกกับ cmd.exe) และUnxutils , พอร์ต Win32 ของชุดยูทิลิตี Unix แต่ละชุด ในแพ็คเกจใดให้ดู 'sed', 'awk' และ 'grep'


2
unxutils เก่า ตอนนี้สิ่งนี้คือ gnuwin32
barlop

ขอบคุณ JRobert สำหรับคำแนะนำของคุณ ขออภัยที่ฉันไม่ได้เข้าใจ แต่ตอนนี้ฉันสามารถเห็นว่า SED เป็นสิ่งที่
Aziz

@barlop ตั้งแต่ปี 2018, gnuwin32 นั้นเก่าแล้ว .. cygwin มีความทันสมัยมากขึ้น!
barlop

0

คุณยังสามารถใช้GSARเพื่อดำเนินการค้นหาบรรทัดคำสั่งและแทนที่ ทำงานร่วมกับฐานสิบหกและไบนารีเช่นกัน มันจะไม่ทำการยกที่ซับซ้อนที่ regex สามารถทำได้ แต่สำหรับการค้นหาและแทนที่ขั้นพื้นฐานมันจะทำงานได้อย่างรวดเร็วและง่ายดาย

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