Regex Thay thế từ dòng lệnh


21

Có thể regex thay thế từ dòng lệnh? Ngay bây giờ tôi đang sử dụng notepad ++ để làm điều này. Trong dòng lệnh tôi chỉ có thể sử dụng FINDSTR mà chỉ có thể xác định vị trí các tệp / dòng được gia công

EDIT:
Có thể tạo tập lệnh VB và chạy nó từ cmd? Tôi vừa tạo một tập tin "hi.vbs" với nội dung

Msgbox "Hi Buddy"

Sau đó cmd cho phép tôi chạy nó trực tiếp bằng cách gõ "hi" từ dòng lệnh.
Vì vậy, nếu không thể với tập lệnh bó, thì tôi có thể sử dụng một tập lệnh máng VB. Hoặc là..?


Cuối cùng, bạn đặt một câu không có kết luận và toàn bộ phần EDIT không chỉ ra vấn đề giống như "Tôi tạo một thế giới xin chào trong vb, tôi có thể tạo một cái gì đó giống như vậy không? Kiểm tra câu trả lời được đăng bởi @IanPugsley là cách dễ dàng để thực hiện regex-thay thế.
mjsr

@Aziz: có câu trả lời nào trong số này có hiệu quả với bạn không? Nếu vậy, bạn sẽ chấp nhận điều đó? Đó là một phần của việc tham gia vào cộng đồng này; cách chúng tôi cảm ơn nhau để được giúp đỡ. Điểm danh tiếng cho câu trả lời được chấp nhận giúp người dùng khác đánh giá trải nghiệm của nhau. Cảm ơn.
JRobert

Tôi đã suy nghĩ để gọi một cái gì đó như MYVBREPLACE (.vbs) FILENAME REGEXPATTERN REPLACMENT từ dòng lệnh.
Aziz

Câu trả lời:


11

truy cập tại đây
http://gnuwin32.sourceforge.net/packages.html
cuộn xuống SED. Tải về coreutils quá trong khi bạn đang ở đó.

lệnh này sẽ thay thế a bằng b trên toàn cầu và trên mỗi dòng. vì vậy không chỉ là sự xuất hiện đầu tiên trên dòng.

ví dụ: sử dụng 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 không hỗ trợ các biểu thức thông thường, bạn có thể tìm và thay thế bằng nó.

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

Hiển thị bxxx dxxx xxx


Công cụ điên tuyệt vời !!! Công cụ này đã quá quảng cáo. Tôi chưa thể quản lý để sử dụng nó, nhưng khi tôi đọc gnu.org/software/sed/manual/sed.html#The-_0022s_0022-Command tôi có thể thấy rằng điều này có thể làm được nhiều hơn những gì tôi có thể mong đợi. Cảm ơn rất nhiều
Aziz

Các phiên bản mới của bash cũng có thể thực hiện các biểu thức thông thường, đôi khi điều đó là đủ cho các tác vụ đơn giản và không cần sử dụng ngay cả sed.
vtest

và re những gì vtest đã nói, trong trường hợp không ai biết. Cygwin đã bash.
barlop

sed hút với thay thế nhiều dòng mặc dù
kofifus

1
@KennyEvitt cmd shell đòi hỏi một tinh chỉnh để có được nó để hiển thị và sử dụng chcp cho unicode utf8 chcp 65001 (như bạn nói, UTF16 encoding.chcp 1200 và chcp 12001 không được hỗ trợ) stackoverflow.com/questions/9321419/... Không chắc lại bạc hà Không chắc chắn lại quyền hạn. Nhưng utf-8 được hỗ trợ ok trong cmd hoặc powershell. Miễn là một phông chữ hỗ trợ được sử dụng như chuyển phát nhanh mới và miễn là nó được mã hóa 65001. Có một cmd / u cho mã hóa utf16.
barlop

26

Tôi đã viết một công cụ dòng lệnh miễn phí cho Windows để làm điều này. Nó được gọi là rxrepl , nó hỗ trợ tìm kiếm tệp và Unicode. Một số có thể tìm thấy nó một công cụ hữu ích.

rxrepl là một công cụ dòng lệnh của Microsoft Windows để tìm kiếm và thay thế văn bản trong các tệp văn bản bằng cách sử dụng các biểu thức thông thường tương thích Perl (PCRE).

Nó có các tính năng sau:

  • Tìm kiếm bằng biểu thức chính quy tương thích Perl
  • Sử dụng kết hợp nhóm trong văn bản thay thế
  • Hỗ trợ kết thúc dòng Windows và Unix
  • Hỗ trợ Unicode
  • Chấp nhận nhiều đối số tìm kiếm / thay thế
  • Tùy chọn có thể được cung cấp trong một tệp tùy chọn
  • Quét các tập tin
  • Chế độ xem trước
  • Chế độ khớp dòng và đầy đủ

nhập mô tả hình ảnh ở đây


4
Thật đáng kinh ngạc! Nếu bạn đang như tôi và nhu cầu ví dụ, thay thông số này "foobar" với "Foo Fighters" trong một tập tin: rxrepl.exe -f file.txt -a -s "(foo) bar" -r "\ 1fighters"
Dunc

1
Ngoài ra, bạn sẽ có nguồn trên một cái gì đó như github? Hoàn toàn dễ hiểu nếu nó không có nghĩa là nguồn mở, nhưng tôi rất tò mò.
kayleeFrye_onDeck

1
@Steztric Thật sao? Tôi đang chạy các cửa sổ 64 bit và dường như không có vấn đề gì khi chạy nó từC:\WINDOWS\System32\cmd.exe
kayleeFrye_onDeck

1
Công cụ tuyệt vời! Chạy không có vấn đề trong Windows Server Std 2012 R2 x64. Cám ơn!
kwrl

2
Công cụ tuyệt vời, tôi hy vọng bạn vẫn đang duy trì nó
chảy nước vào

12

The Scripting Guy bao gồm cách thực hiện điều này trong PowerShell (không có bản tải xuống bổ sung nào trên hầu hết các HĐH Windows gần đây, có lẽ bạn đã cài đặt nó).

Khởi động nó, chạy như sau (để thay thế a *bằng a @):

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

Điều này hỗ trợ các biểu thức chính quy .NET , bao gồm cả hướng nhìn tích cực và tiêu cực, và tất cả mọi thứ về notepad ++ đều không hỗ trợ với regex trước phiên bản 6.x (nhiều như tôi yêu notepad ++).


1
Notepad ++ hỗ trợ PCRE đầy đủ kể từ phiên bản 6.
Bob

5

Tôi đã tìm thấy fnr.exe cho điều đó. Nó có GUI và dòng lệnh.

Một công cụ nguồn mở để tìm và thay thế văn bản trong nhiều tệp.

Tính năng, đặc điểm

  • Tải xuống một tệp - fnr.exe (127kb)
  • Thay thế văn bản trong nhiều tệp bằng ứng dụng windows hoặc thông qua dòng lệnh
  • Tìm Chỉ để xem nơi tìm thấy kết quả khớp
  • Tìm kiếm phân biệt chữ hoa chữ thường
  • Tìm kiếm tệp trong một thư mục hoặc đệ quy thư mục con
  • Biểu thức chính quy
  • Tìm và thay thế văn bản nhiều dòng
  • Tạo nút dòng lệnh để tạo văn bản dòng lệnh để đặt trong tệp bó
  • Trợ giúp dòng lệnh
  • Kiểm tra đơn vị của động cơ Tìm / Thay thế

Xem các tùy chọn dòng lệnh

nhập mô tả hình ảnh ở đây


1
Khá hay - bạn có thể kiểm tra câu lệnh "find" của mình trong GUI, nhấp vào "Gen Thay thế dòng lệnh" và sẵn sàng sử dụng lệnh gọi dòng lệnh. Không cần phải dành thời gian để làm quen với cú pháp dòng lệnh.
sarh

Tôi không thể quản lý để có được điều này để thoát sau khi thực hiện các thay đổi. Tôi phải nhấn enter để đóng khiến điều này không đặc biệt hữu ích cho kịch bản
G-.

@ G-. Không phải chờ <enter> nếu nó được chạy từ một tệp bó.
Sergius

Tôi không thể tìm cách xuất ra một tên tệp / phần mở rộng khác
Rick

4

Có vẻ như bạn có thể sử dụng regex với FINDSTR

findstr [Windows CMD] :

findstr cho phép tìm kiếm văn bản (như được chỉ định với mẫu trong tên tệp tệp. Nếu tên tệp chứa ký tự đại diện (* hoặc?), nó sẽ tìm kiếm trong tất cả các tệp khớp. Tùy chọn / S tìm kiếm trong thư mục hiện tại cũng như trong thư mục con của nó. Nếu mẫu chứa khoảng trắng, nó phải được chỉ định như vậy / C: "một số văn bản cần tìm". Để biến mẫu thành biểu thức chính quy, phải sử dụng tùy chọn / R. vô cảm.

Từ trợ giúp của FindStr ( Findstr /?):

/ R - Sử dụng các chuỗi tìm kiếm như các biểu thức thông thường.

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

Cảm ơn câu trả lời của bạn, nhưng đây không phải là câu hỏi của tôi.
Aziz

2
findstrkhông thể thay thế văn bản trong tập tin!
Kenny Evitt

4

Tôi đến bữa tiệc muộn một chút, nhưng JREPL.BAT là tiện ích regex dựa trên tập lệnh JScript / batch chạy tự nhiên trên bất kỳ máy Windows nào từ XP trở đi.

Tài liệu đầy đủ được tích hợp vào tập lệnh, có thể được truy cập thông qua JREPL /?hoặc sử dụng JREPL /??cho đầu ra phân trang.

JREPL sử dụng regex ECMA tiêu chuẩn đi kèm với JScript. ECMA regex không mạnh bằng regex .NET có sẵn cho powershell, nhưng nó vẫn khá tốt. Và tôi nghĩ rằng người dùng trung bình sẽ thấy tiện ích này dễ sử dụng hơn powershell.

Các tùy chọn JREPL tích hợp đã cung cấp rất nhiều sức mạnh vốn có, nhưng khả năng tiêm JScript do người dùng cung cấp thực sự mở ra những khả năng đáng kinh ngạc.

Tôi đã phát triển tập lệnh vì nơi làm việc của tôi không cho phép tải xuống các tệp exe không chuẩn, nhưng không hạn chế việc viết tập lệnh hoặc tập lệnh JScript :-)

Chỉ cần theo liên kết và sao chép mã tập lệnh vào một tệp có tên JREPL.BAT. Đọc các bài viết tiếp theo từ chủ đề đó để biết ví dụ về lịch sử sử dụng và phát triển. Ngoài ra còn có nhiều câu trả lời StackOverflow sử dụng JREPL.BAT.


3

Hai lựa chọn tốt là Cygwin sẽ cung cấp cho bạn một môi trường giống như bash của Unix (thay thế cho cmd.exe); và Unxutils , cổng Win32 của một tập hợp các tiện ích Unix riêng lẻ. Trong cả hai gói, hãy xem 'sed', 'awk' và 'grep'.


2
unxutils là cũ. bây giờ điều là gnuwin32
barlop

Cảm ơn bạn JRobert cho đề nghị của bạn. Xin lỗi vì tôi đã không hiểu rõ về nó, nhưng bây giờ tôi có thể thấy SED là thứ đó.
Aziz

@barlop tính đến năm 2018, gnuwin32 giờ cũng đã cũ .. cygwin đã được cập nhật hơn!
barlop

0

Bạn cũng có thể sử dụng GSAR để thực hiện tìm kiếm và thay thế dòng lệnh. Hoạt động với hex và nhị phân là tốt. Nó sẽ không thực hiện các công việc nặng nề phức tạp mà regex có thể thực hiện, nhưng đối với tìm kiếm và thay thế cơ bản, nó thực hiện công việc nhanh chóng và dễ dàng.

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.