Làm thế nào bạn có thể tìm và thay thế văn bản trong một tệp bằng môi trường dòng lệnh Windows?


492

Tôi đang viết một tập lệnh tệp bó bằng môi trường dòng lệnh Windows và muốn thay đổi từng lần xuất hiện của một số văn bản trong một tệp (ví dụ: "FOO") bằng một tập tin khác (ví dụ: "BAR"). Cách đơn giản nhất để làm điều đó là gì? Bất kỳ chức năng được xây dựng?



sử dụng cái này:echo(%text:%search%=%replace%%)
nhà khoa

Câu trả lời:


308

Rất nhiều câu trả lời ở đây đã giúp tôi đi đúng hướng, tuy nhiên không có câu nào phù hợp với tôi, vì vậy tôi đang đăng giải pháp của mình.

Tôi có Windows 7, đi kèm với PowerShell tích hợp. Đây là tập lệnh tôi đã sử dụng để tìm / thay thế tất cả các phiên bản văn bản trong một tệp:

powershell -Command "(gc myFile.txt) -replace 'foo', 'bar' | Out-File -encoding ASCII myFile.txt"

Để giải thích nó:

  • powershell khởi động powershell.exe, được bao gồm trong Windows 7
  • -Command "... " là một dòng lệnh arg cho powershell.exe có chứa lệnh để chạy
  • (gc myFile.txt)đọc nội dung của myFile.txt( gcviết tắt của Get-Contentlệnh)
  • -replace 'foo', 'bar'chỉ cần chạy lệnh thay thế để thay thế foobằngbar
  • | Out-File myFile.txt dẫn đầu ra vào tập tin myFile.txt
  • -encoding ASCII ngăn việc sao chép tệp đầu ra thành unicode, như các ý kiến ​​chỉ ra

Powershell.exe phải là một phần của câu lệnh PATH của bạn, nhưng nếu không, bạn có thể thêm nó. Vị trí của nó trên máy của tôi làC:\WINDOWS\system32\WindowsPowerShell\v1.0


71
Coi chừng, lệnh này cũng có thể chuyển mã tệp sang mã hóa Unicode. Bạn có thể chỉ định thủ công mã hóa bằng cách thêm -encoding ASCIIhoặc UTF8hoặc bất cứ điều gì cần thiết. Ngoài ra, hãy cẩn thận, nếu bạn nhắm mục tiêu UTF8, nó có thể giới thiệu Dấu thứ tự Byte ở đầu tệp không xuất hiện trong bản gốc.
Wyck

78
@Wyck Tôi phải mất một lúc để tìm ra nơi để đặt -encoding ASCII. Đối với bất cứ ai cần nó trong tương lai, nó sẽ làOut-File -encoding ASCII myFile.txt
rwilson04

15
Điều duy nhất tôi phải thay đổi là sử dụng Set-Contentthay vì Out-File.
kurtzmarc

6
Điều này hoạt động, nhưng hiệu suất là khủng khiếp ngay cả một danh sách ngắn các tập tin.
jsuddsjr

23
Lưu ý rằng mã thông báo thay thế ('foo' trong trường hợp này) được coi là biểu thức thông thường. Nếu bạn có bất kỳ ký tự đặc biệt nào ở đó (tôi đã có []), bạn cần thêm trước chúng bằng \ (dấu gạch chéo ngược).
JW

183

Nếu bạn đang dùng phiên bản Windows hỗ trợ .Net 2.0, tôi sẽ thay thế trình bao của bạn. PowerShell cung cấp cho bạn toàn bộ sức mạnh của .Net từ dòng lệnh. Có rất nhiều lệnh được xây dựng là tốt. Ví dụ dưới đây sẽ giải quyết câu hỏi của bạn. Tôi đang sử dụng tên đầy đủ của các lệnh, có các bí danh ngắn hơn, nhưng điều này mang lại cho bạn một cái gì đó cho Google.

(Get-Content test.txt) | ForEach-Object { $_ -replace "foo", "bar" } | Set-Content test2.txt

10
Tôi có thể thấy PowerShell có khả năng lưu trữ điều này. Nhưng làm thế nào tôi có thể thực hiện việc này chạy từ một tệp bó (ví dụ: myProc.bat)?
Pablo Venturino

3
@Pablo, sử dụng powershell.exe và gói lệnh ps thành một tham số duy nhất
Lubos hasko

56
-1 .. Chắc chắn câu trả lời đã được chấp nhận, nhưng nó không trả lời cho câu hỏi được chỉ định.
baash05

28
Điều này sẽ thất bại với một lỗi sử dụng nếu bạn lưu vào cùng một tệp. Bạn cần thay đổi lệnh powershell thành: (Get-Content test.txt) | ForEach-Object {$ _ -replace "foo", "bar"} | Set-Content test.txt
BigMomma

6
Xem câu trả lời từ @Rachel:powershell -Command "(gc myFile.txt) -replace 'foo', 'bar' | sc myFile.txt"
Nigel Touch

161

Chỉ sử dụng FART ( tiện ích dòng lệnh " F ind A nd R eplace T ext"):
phần mềm miễn phí nhỏ tuyệt vời để thay thế văn bản trong một tập hợp lớn các tệp.

Các tập tin thiết lập là trên SourceForge .

Ví dụ sử dụng:

fart.exe -p -r -c -- C:\tools\perl-5.8.9\* @@APP_DIR@@ C:\tools

sẽ xem trước các thay thế để thực hiện đệ quy trong các tệp của bản phân phối Perl này.

Vấn đề duy nhất: biểu tượng trang web FART không chính xác trang nhã, tinh tế hoặc thanh lịch;)


Cập nhật 2017 (7 năm sau) jagb chỉ ra trong các bình luận cho bài viết năm 2011 " FARTing the Easy Way - Tìm và thay thế văn bản " từ Mikail Tunç


19
Điều thú vị là nó là một exe duy nhất. Không phụ thuộc. Không in nhỏ. Siêu dễ triển khai.
Serge Wautier

2
Rất nhẹ và dễ sử dụng, nhưng tôi đã hy vọng nó sẽ in ra chính xác những nơi thay thế đã diễn ra. Không thể nhìn thấy điều đó cho tôi cảm giác bất an.
William Niu

4
Cảm ơn, nó hoàn hảo, nên là một phần của các công cụ dos tiêu chuẩn và làm việc say mê. Tuy nhiên, tùy chọn -p không cho bạn thấy có bao nhiêu thay đổi mà nó sẽ thực hiện và luôn báo cáo 0, điều đó đã ném tôi trong vài phút
sradforth

3
Tôi hiểu đây là một câu hỏi rất cũ nhưng tôi đã tìm thấy nhiều thông tin hơn và hy vọng nó sẽ hữu ích cho người dùng Stack Overflow. Chỉ cần một liên kết khác cho FART nơi sản phẩm được giải thích rõ: FART đã giải thích @ emtunc.org và một trang khác có thể được tìm thấy ở đây: FART Hãy cẩn thận với việc thay thế /'vì điều này không hiệu quả với tất cả chúng tôi , vì tôi đã làm việc với một số người trường hợp nhưng nó không hoạt động trên một số tệp và tôi không biết tại sao .. Tôi đã sử dụng nó để thay thế văn bản bằng văn bản khác và một/
jagb

4
@jagb Cảm ơn bạn. Tôi đã bao gồm liên kết của bạn trong câu trả lời để dễ nhìn hơn.
VonC

128

Thay thế - Thay thế một chuỗi con bằng cách sử dụng thay thế chuỗi Mô tả: Để thay thế một chuỗi con bằng một chuỗi khác, hãy sử dụng tính năng thay thế chuỗi. Ví dụ hiển thị ở đây thay thế tất cả các lỗi chính tả "teh" bằng "the" trong chuỗi biến str.

set str=teh cat in teh hat
echo.%str%
set str=%str:teh=the%
echo.%str%

Tập lệnh đầu ra:

teh cat in teh hat
the cat in the hat

ref: http://www.dostips.com/DtTipsStringManipulation.php#Snippets.Replace


30
Làm thế nào là gợi ý sed tốt hơn? Đây dường như là câu trả lời đơn giản nhất trong tất cả chúng và không yêu cầu cài đặt gì.
DonBecker

5
Có thể thực hiện bất kỳ loại khớp mẫu nào ở đây không? Ký tự đại diện, Regex vv?
Keyo

27
"Làm thế nào là gợi ý sed tốt hơn?" - sed và các tiện ích tương tự hoạt động trên các tập tin; đoạn mã này bỏ qua bước quan trọng của việc đọc các dòng từ tệp đầu vào và ghi vào tệp đầu ra, trong khi đảm bảo rằng bất kỳ ký tự đặc biệt nào trong tệp được xử lý chính xác.
Joe

7
@Asad, đúng vậy, OP đã hỏi về các tệp, nhưng thực tế nó hoạt động với các luồng không phải là tệp. Nhưng quan điểm của tôi ở đây là câu trả lời này còn thiếu sót, vì nó bỏ qua việc đọc / viết từ một luồng và xử lý bất kỳ ký tự đặc biệt nào.
Joe

4
@Bill làm thế nào để sử dụng biến như một văn bản thay thế? I E. Tôi có giá trị trong một biến và một chuỗi có một số dấu phân cách. đặt str =% str: "##" =% varValue %% không hoạt động. Bất kỳ cách giải quyết?
MalTec

55

Tạo tập tin 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  'WriteLine adds extra CR/LF
objFile.Close

Để sử dụng tập lệnh sửa đổi này (mà chúng ta sẽ gọi thay thế.vbs) chỉ cần nhập một lệnh tương tự như thế này từ dấu nhắc lệnh:

cscript replace.vbs "C:\Scripts\Text.txt" "Jim " "James "


Điều này là gọn gàng, nó có cho phép sử dụng RegEx không?
dùng280109

3
@ user280109 Có, VBScript hỗ trợ RegExp. Bạn có thể sử dụng điều này để thay thế bằng cách sử dụng một biểu thức thông thường : With (New RegExp): strNewText = .Replace(strText, strOldText, strNewText): End With. Bạn có thể nhận được văn bản của 9 nhóm chụp đầu tiên sử dụng $1, $2... $9.
Bàn chải đánh răng

2
VBScript thường bị bỏ qua (và bị ghét), nhưng có sẵn trên tất cả các nền tảng Windows, rất dễ đọc và thực sự có khả năng rất mạnh +1
zelanix

1
@ user280109 Bạn vừa đưa ra lệnh, Tôi cần gì. Nhưng tôi muốn thay thế (không phân biệt chữ hoa chữ thường) Bạn có thể cung cấp lệnh cho điều đó không?
Ajmal Praveen

49

BatchSubstitute.battrên dostips.com là một ví dụ về tìm kiếm và thay thế bằng tệp bó thuần túy.

Nó sử dụng kết hợp FOR, FINDCALL SET.

Các dòng chứa các ký tự trong số "&<>]|^có thể được xử lý không chính xác.



8
Tôi phải đặt câu hỏi về tính hữu ích của trang web đoạn mã có điều khoản sử dụng nghiêm cấm sao chép bất kỳ mã nào .
Gilles 'SO- ngừng trở nên xấu xa'

1
Tôi đồng ý các điều khoản của họ rất khó hiểu, họ cũng nói "Thông tin được cung cấp dưới tên miền dostips.com hy vọng là hữu ích" vì vậy tôi cho rằng họ rất vui khi mọi người sao chép mã để giải quyết vấn đề. Tôi không chắc chắn mình đã từng đọc bất kỳ điều khoản và điều kiện nào và rất vui ...
morechilli

5
Điều đó thật tuyệt. Tôi thích câu trả lời không liên quan đến việc tải xuống một cái gì đó khác để làm điều đó.
Ruairi O'Brien

Tôi cũng thích các giải pháp không liên quan đến các tiện ích bên ngoài, thật không may, tôi tiếp tục nhận được "find: vị từ không hợp lệ` '"khi tôi cố gắng chạy đợt này. Đừng thực sự có thời gian để gỡ lỗi nó ngay bây giờ.
Jahmic

2
Lỗi "find: vị ngữ không hợp lệ` '"là do tiện ích' find 'bên ngoài trên hệ thống của tôi. Sau khi loại bỏ, điều này làm việc tốt.
Jahmic

47

Lưu ý - Đảm bảo xem bản cập nhật ở cuối câu trả lời này để biết liên kết đến JREPL.BAT vượt trội thay thế REPL.BAT
JREPL.BAT 7.0 trở lên hỗ trợ unicode (UTF-16LE) thông qua /UTFtùy chọn, cũng như bất kỳ bộ ký tự khác, bao gồm UTF-8, thông qua ADO !!!!


Tôi đã viết một tiện ích JScript / batch lai nhỏ có tên REPL.BAT rất thuận tiện cho việc sửa đổi các tệp ASCII (hoặc ASCII mở rộng) thông qua dòng lệnh hoặc tệp bó. Tập lệnh gốc hoàn toàn không yêu cầu cài đặt bất kỳ bên thứ 3 nào có thể thực thi được và nó hoạt động trên mọi phiên bản Windows hiện đại từ XP trở đi. Nó cũng rất nhanh, đặc biệt khi so sánh với các giải pháp lô thuần túy.

REPL.BAT chỉ đơn giản là đọc stdin, thực hiện tìm kiếm và thay thế regex JScript và ghi kết quả vào thiết bị xuất chuẩn.

Dưới đây là một ví dụ tầm thường về cách thay thế foo bằng thanh trong test.txt, giả sử REPL.BAT có trong thư mục hiện tại của bạn hoặc tốt hơn là ở đâu đó trong PATH của bạn:

type test.txt|repl "foo" "bar" >test.txt.new
move /y test.txt.new test.txt

Các khả năng regex của JScript làm cho nó rất mạnh mẽ, đặc biệt là khả năng của văn bản thay thế để tham chiếu các chuỗi con được chụp từ văn bản tìm kiếm.

Tôi đã bao gồm một số tùy chọn trong tiện ích khiến nó khá mạnh mẽ. Ví dụ: kết hợp các tùy chọn MXcho phép sửa đổi các tệp nhị phân! Các Mtùy chọn Multi-dòng cho phép tìm kiếm trên nhiều dòng. Các Xtùy chọn mẫu thay thế mở rộng cung cấp chuỗi thoát cho phép bao gồm của bất kỳ giá trị nhị phân trong các văn bản thay thế.

Toàn bộ tiện ích có thể đã được viết dưới dạng JScript thuần túy, nhưng tệp bó kết hợp loại bỏ yêu cầu chỉ định rõ ràng CSCRIPT mỗi khi bạn muốn sử dụng tiện ích.

Đây là kịch bản REPL.BAT. Tài liệu đầy đủ được nhúng trong tập lệnh.

@if (@X)==(@Y) @end /* Harmless hybrid line that begins a JScript comment

::************ Documentation ***********
::REPL.BAT version 6.2
:::
:::REPL  Search  Replace  [Options  [SourceVar]]
:::REPL  /?[REGEX|REPLACE]
:::REPL  /V
:::
:::  Performs a global regular expression search and replace operation on
:::  each line of input from stdin and prints the result to stdout.
:::
:::  Each parameter may be optionally enclosed by double quotes. The double
:::  quotes are not considered part of the argument. The quotes are required
:::  if the parameter contains a batch token delimiter like space, tab, comma,
:::  semicolon. The quotes should also be used if the argument contains a
:::  batch special character like &, |, etc. so that the special character
:::  does not need to be escaped with ^.
:::
:::  If called with a single argument of /?, then prints help documentation
:::  to stdout. If a single argument of /?REGEX, then opens up Microsoft's
:::  JScript regular expression documentation within your browser. If a single
:::  argument of /?REPLACE, then opens up Microsoft's JScript REPLACE
:::  documentation within your browser.
:::
:::  If called with a single argument of /V, case insensitive, then prints
:::  the version of REPL.BAT.
:::
:::  Search  - By default, this is a case sensitive JScript (ECMA) regular
:::            expression expressed as a string.
:::
:::            JScript regex syntax documentation is available at
:::            http://msdn.microsoft.com/en-us/library/ae5bf541(v=vs.80).aspx
:::
:::  Replace - By default, this is the string to be used as a replacement for
:::            each found search expression. Full support is provided for
:::            substituion patterns available to the JScript replace method.
:::
:::            For example, $& represents the portion of the source that matched
:::            the entire search pattern, $1 represents the first captured
:::            submatch, $2 the second captured submatch, etc. A $ literal
:::            can be escaped as $$.
:::
:::            An empty replacement string must be represented as "".
:::
:::            Replace substitution pattern syntax is fully documented at
:::            http://msdn.microsoft.com/en-US/library/efy6s3e6(v=vs.80).aspx
:::
:::  Options - An optional string of characters used to alter the behavior
:::            of REPL. The option characters are case insensitive, and may
:::            appear in any order.
:::
:::            A - Only print altered lines. Unaltered lines are discarded.
:::                If the S options is present, then prints the result only if
:::                there was a change anywhere in the string. The A option is
:::                incompatible with the M option unless the S option is present.
:::
:::            B - The Search must match the beginning of a line.
:::                Mostly used with literal searches.
:::
:::            E - The Search must match the end of a line.
:::                Mostly used with literal searches.
:::
:::            I - Makes the search case-insensitive.
:::
:::            J - The Replace argument represents a JScript expression.
:::                The expression may access an array like arguments object
:::                named $. However, $ is not a true array object.
:::
:::                The $.length property contains the total number of arguments
:::                available. The $.length value is equal to n+3, where n is the
:::                number of capturing left parentheses within the Search string.
:::
:::                $[0] is the substring that matched the Search,
:::                $[1] through $[n] are the captured submatch strings,
:::                $[n+1] is the offset where the match occurred, and
:::                $[n+2] is the original source string.
:::
:::                Arguments $[0] through $[10] may be abbreviated as
:::                $1 through $10. Argument $[11] and above must use the square
:::                bracket notation.
:::
:::            L - The Search is treated as a string literal instead of a
:::                regular expression. Also, all $ found in the Replace string
:::                are treated as $ literals.
:::
:::            M - Multi-line mode. The entire contents of stdin is read and
:::                processed in one pass instead of line by line, thus enabling
:::                search for \n. This also enables preservation of the original
:::                line terminators. If the M option is not present, then every
:::                printed line is terminated with carriage return and line feed.
:::                The M option is incompatible with the A option unless the S
:::                option is also present.
:::
:::                Note: If working with binary data containing NULL bytes,
:::                      then the M option must be used.
:::
:::            S - The source is read from an environment variable instead of
:::                from stdin. The name of the source environment variable is
:::                specified in the next argument after the option string. Without
:::                the M option, ^ anchors the beginning of the string, and $ the
:::                end of the string. With the M option, ^ anchors the beginning
:::                of a line, and $ the end of a line.
:::
:::            V - Search and Replace represent the name of environment
:::                variables that contain the respective values. An undefined
:::                variable is treated as an empty string.
:::
:::            X - Enables extended substitution pattern syntax with support
:::                for the following escape sequences within the Replace string:
:::
:::                \\     -  Backslash
:::                \b     -  Backspace
:::                \f     -  Formfeed
:::                \n     -  Newline
:::                \q     -  Quote
:::                \r     -  Carriage Return
:::                \t     -  Horizontal Tab
:::                \v     -  Vertical Tab
:::                \xnn   -  Extended ASCII byte code expressed as 2 hex digits
:::                \unnnn -  Unicode character expressed as 4 hex digits
:::
:::                Also enables the \q escape sequence for the Search string.
:::                The other escape sequences are already standard for a regular
:::                expression Search string.
:::
:::                Also modifies the behavior of \xnn in the Search string to work
:::                properly with extended ASCII byte codes.
:::
:::                Extended escape sequences are supported even when the L option
:::                is used. Both Search and Replace support all of the extended
:::                escape sequences if both the X and L opions are combined.
:::
:::  Return Codes:  0 = At least one change was made
:::                     or the /? or /V option was used
:::
:::                 1 = No change was made
:::
:::                 2 = Invalid call syntax or incompatible options
:::
:::                 3 = JScript runtime error, typically due to invalid regex
:::
::: REPL.BAT was written by Dave Benham, with assistance from DosTips user Aacini
::: to get \xnn to work properly with extended ASCII byte codes. Also assistance
::: from DosTips user penpen diagnosing issues reading NULL bytes, along with a
::: workaround. REPL.BAT was originally posted at:
::: http://www.dostips.com/forum/viewtopic.php?f=3&t=3855
:::

::************ Batch portion ***********
@echo off
if .%2 equ . (
  if "%~1" equ "/?" (
    <"%~f0" cscript //E:JScript //nologo "%~f0" "^:::" "" a
    exit /b 0
  ) else if /i "%~1" equ "/?regex" (
    explorer "http://msdn.microsoft.com/en-us/library/ae5bf541(v=vs.80).aspx"
    exit /b 0
  ) else if /i "%~1" equ "/?replace" (
    explorer "http://msdn.microsoft.com/en-US/library/efy6s3e6(v=vs.80).aspx"
    exit /b 0
  ) else if /i "%~1" equ "/V" (
    <"%~f0" cscript //E:JScript //nologo "%~f0" "^::(REPL\.BAT version)" "$1" a
    exit /b 0
  ) else (
    call :err "Insufficient arguments"
    exit /b 2
  )
)
echo(%~3|findstr /i "[^SMILEBVXAJ]" >nul && (
  call :err "Invalid option(s)"
  exit /b 2
)
echo(%~3|findstr /i "M"|findstr /i "A"|findstr /vi "S" >nul && (
  call :err "Incompatible options"
  exit /b 2
)
cscript //E:JScript //nologo "%~f0" %*
exit /b %errorlevel%

:err
>&2 echo ERROR: %~1. Use REPL /? to get help.
exit /b

************* JScript portion **********/
var rtn=1;
try {
  var env=WScript.CreateObject("WScript.Shell").Environment("Process");
  var args=WScript.Arguments;
  var search=args.Item(0);
  var replace=args.Item(1);
  var options="g";
  if (args.length>2) options+=args.Item(2).toLowerCase();
  var multi=(options.indexOf("m")>=0);
  var alterations=(options.indexOf("a")>=0);
  if (alterations) options=options.replace(/a/g,"");
  var srcVar=(options.indexOf("s")>=0);
  if (srcVar) options=options.replace(/s/g,"");
  var jexpr=(options.indexOf("j")>=0);
  if (jexpr) options=options.replace(/j/g,"");
  if (options.indexOf("v")>=0) {
    options=options.replace(/v/g,"");
    search=env(search);
    replace=env(replace);
  }
  if (options.indexOf("x")>=0) {
    options=options.replace(/x/g,"");
    if (!jexpr) {
      replace=replace.replace(/\\\\/g,"\\B");
      replace=replace.replace(/\\q/g,"\"");
      replace=replace.replace(/\\x80/g,"\\u20AC");
      replace=replace.replace(/\\x82/g,"\\u201A");
      replace=replace.replace(/\\x83/g,"\\u0192");
      replace=replace.replace(/\\x84/g,"\\u201E");
      replace=replace.replace(/\\x85/g,"\\u2026");
      replace=replace.replace(/\\x86/g,"\\u2020");
      replace=replace.replace(/\\x87/g,"\\u2021");
      replace=replace.replace(/\\x88/g,"\\u02C6");
      replace=replace.replace(/\\x89/g,"\\u2030");
      replace=replace.replace(/\\x8[aA]/g,"\\u0160");
      replace=replace.replace(/\\x8[bB]/g,"\\u2039");
      replace=replace.replace(/\\x8[cC]/g,"\\u0152");
      replace=replace.replace(/\\x8[eE]/g,"\\u017D");
      replace=replace.replace(/\\x91/g,"\\u2018");
      replace=replace.replace(/\\x92/g,"\\u2019");
      replace=replace.replace(/\\x93/g,"\\u201C");
      replace=replace.replace(/\\x94/g,"\\u201D");
      replace=replace.replace(/\\x95/g,"\\u2022");
      replace=replace.replace(/\\x96/g,"\\u2013");
      replace=replace.replace(/\\x97/g,"\\u2014");
      replace=replace.replace(/\\x98/g,"\\u02DC");
      replace=replace.replace(/\\x99/g,"\\u2122");
      replace=replace.replace(/\\x9[aA]/g,"\\u0161");
      replace=replace.replace(/\\x9[bB]/g,"\\u203A");
      replace=replace.replace(/\\x9[cC]/g,"\\u0153");
      replace=replace.replace(/\\x9[dD]/g,"\\u009D");
      replace=replace.replace(/\\x9[eE]/g,"\\u017E");
      replace=replace.replace(/\\x9[fF]/g,"\\u0178");
      replace=replace.replace(/\\b/g,"\b");
      replace=replace.replace(/\\f/g,"\f");
      replace=replace.replace(/\\n/g,"\n");
      replace=replace.replace(/\\r/g,"\r");
      replace=replace.replace(/\\t/g,"\t");
      replace=replace.replace(/\\v/g,"\v");
      replace=replace.replace(/\\x[0-9a-fA-F]{2}|\\u[0-9a-fA-F]{4}/g,
        function($0,$1,$2){
          return String.fromCharCode(parseInt("0x"+$0.substring(2)));
        }
      );
      replace=replace.replace(/\\B/g,"\\");
    }
    search=search.replace(/\\\\/g,"\\B");
    search=search.replace(/\\q/g,"\"");
    search=search.replace(/\\x80/g,"\\u20AC");
    search=search.replace(/\\x82/g,"\\u201A");
    search=search.replace(/\\x83/g,"\\u0192");
    search=search.replace(/\\x84/g,"\\u201E");
    search=search.replace(/\\x85/g,"\\u2026");
    search=search.replace(/\\x86/g,"\\u2020");
    search=search.replace(/\\x87/g,"\\u2021");
    search=search.replace(/\\x88/g,"\\u02C6");
    search=search.replace(/\\x89/g,"\\u2030");
    search=search.replace(/\\x8[aA]/g,"\\u0160");
    search=search.replace(/\\x8[bB]/g,"\\u2039");
    search=search.replace(/\\x8[cC]/g,"\\u0152");
    search=search.replace(/\\x8[eE]/g,"\\u017D");
    search=search.replace(/\\x91/g,"\\u2018");
    search=search.replace(/\\x92/g,"\\u2019");
    search=search.replace(/\\x93/g,"\\u201C");
    search=search.replace(/\\x94/g,"\\u201D");
    search=search.replace(/\\x95/g,"\\u2022");
    search=search.replace(/\\x96/g,"\\u2013");
    search=search.replace(/\\x97/g,"\\u2014");
    search=search.replace(/\\x98/g,"\\u02DC");
    search=search.replace(/\\x99/g,"\\u2122");
    search=search.replace(/\\x9[aA]/g,"\\u0161");
    search=search.replace(/\\x9[bB]/g,"\\u203A");
    search=search.replace(/\\x9[cC]/g,"\\u0153");
    search=search.replace(/\\x9[dD]/g,"\\u009D");
    search=search.replace(/\\x9[eE]/g,"\\u017E");
    search=search.replace(/\\x9[fF]/g,"\\u0178");
    if (options.indexOf("l")>=0) {
      search=search.replace(/\\b/g,"\b");
      search=search.replace(/\\f/g,"\f");
      search=search.replace(/\\n/g,"\n");
      search=search.replace(/\\r/g,"\r");
      search=search.replace(/\\t/g,"\t");
      search=search.replace(/\\v/g,"\v");
      search=search.replace(/\\x[0-9a-fA-F]{2}|\\u[0-9a-fA-F]{4}/g,
        function($0,$1,$2){
          return String.fromCharCode(parseInt("0x"+$0.substring(2)));
        }
      );
      search=search.replace(/\\B/g,"\\");
    } else search=search.replace(/\\B/g,"\\\\");
  }
  if (options.indexOf("l")>=0) {
    options=options.replace(/l/g,"");
    search=search.replace(/([.^$*+?()[{\\|])/g,"\\$1");
    if (!jexpr) replace=replace.replace(/\$/g,"$$$$");
  }
  if (options.indexOf("b")>=0) {
    options=options.replace(/b/g,"");
    search="^"+search
  }
  if (options.indexOf("e")>=0) {
    options=options.replace(/e/g,"");
    search=search+"$"
  }
  var search=new RegExp(search,options);
  var str1, str2;

  if (srcVar) {
    str1=env(args.Item(3));
    str2=str1.replace(search,jexpr?replFunc:replace);
    if (!alterations || str1!=str2) if (multi) {
      WScript.Stdout.Write(str2);
    } else {
      WScript.Stdout.WriteLine(str2);
    }
    if (str1!=str2) rtn=0;
  } else if (multi){
    var buf=1024;
    str1="";
    while (!WScript.StdIn.AtEndOfStream) {
      str1+=WScript.StdIn.Read(buf);
      buf*=2
    }
    str2=str1.replace(search,jexpr?replFunc:replace);
    WScript.Stdout.Write(str2);
    if (str1!=str2) rtn=0;
  } else {
    while (!WScript.StdIn.AtEndOfStream) {
      str1=WScript.StdIn.ReadLine();
      str2=str1.replace(search,jexpr?replFunc:replace);
      if (!alterations || str1!=str2) WScript.Stdout.WriteLine(str2);
      if (str1!=str2) rtn=0;
    }
  }
} catch(e) {
  WScript.Stderr.WriteLine("JScript runtime error: "+e.message);
  rtn=3;
}
WScript.Quit(rtn);

function replFunc($0, $1, $2, $3, $4, $5, $6, $7, $8, $9, $10) {
  var $=arguments;
  return(eval(replace));
}


CẬP NHẬT QUAN TRỌNG

Tôi đã ngừng phát triển REPL.BAT và thay thế nó bằng JREPL.BAT. Tiện ích mới hơn này có tất cả các chức năng tương tự của REPL.BAT, và nhiều hơn nữa:

  • Hỗ trợ Unicode UTF-16LE thông qua các khả năng unicode gốc CSCRIPT và bất kỳ bộ ký tự nào khác (bao gồm UTF-8) thông qua ADO.
  • Đọc trực tiếp từ / ghi trực tiếp vào một tệp: không cần đường ống, chuyển hướng hoặc lệnh di chuyển.
  • Kết hợp người dùng cung cấp JScript
  • Cơ sở dịch thuật tương tự unix tr, chỉ có nó cũng hỗ trợ tìm kiếm regex và thay thế JScript
  • Hủy văn bản không phù hợp
  • Dòng đầu ra tiền tố với số dòng
  • và hơn thế nữa...

Như mọi khi, tài liệu đầy đủ được nhúng trong tập lệnh.

Giải pháp tầm thường ban đầu thậm chí còn đơn giản hơn:

jrepl "foo" "bar" /f test.txt /o -

Phiên bản hiện tại của JREPL.BAT có sẵn tại DosTips . Đọc tất cả các bài viết tiếp theo trong chuỗi để xem các ví dụ về việc sử dụng và lịch sử phát triển.


Công cụ tuyệt vời! Tôi yêu sự đơn giản này và cách bạn có thể thích ứng nó với bất kỳ tập lệnh nào, do đó viết mã JS hơn là hàng loạt crappy.
Adaptabi

Chỉnh sửa - Đã thêm tùy chọn A để chỉ in các dòng đã được sửa đổi. Đồng thời tăng cường tùy chọn X để hỗ trợ \qđại diện "và Tìm kiếm bằng chữ hiện hỗ trợ tất cả các chuỗi thoát mở rộng khi kết hợp tùy chọn L và X.
dbenham

@dbenham - +1. Đây là một cách tiếp cận khéo léo, nó cũng sẽ có ích cho một số nhiệm vụ khác. Cảm ơn đã đăng nó.
bw

EDIT - Tôi đã sửa đổi hành vi của \ xnn khi sử dụng tùy chọn X để mã đại diện cho mã byte ASCII mở rộng. Cũng thêm tùy chọn phiên bản / V.
dbenham

9
@dbenham Đây là một viên ngọc quý. Tại sao bạn không đưa nó lên GitHub hoặc dưới dạng Gist? Sẽ làm cho phiên bản, theo dõi, phát hành / phân phối, sửa lỗi và dễ dàng hơn. Nếu bạn cần giúp đỡ với điều đó, hãy cho tôi biết.
Atif Aziz

36

Sử dụng FNR

Sử dụng fnrtiện ích. Nó có một số lợi thế hơn fart:

  • Biểu thức chính quy
  • GUI tùy chọn. Có "Tạo nút dòng lệnh" để tạo văn bản dòng lệnh để đặt trong tệp bó.
  • Các mẫu nhiều dòng: GUI cho phép bạn dễ dàng làm việc với các mẫu nhiều dòng. Trong FART, bạn phải thoát các ngắt dòng theo cách thủ công.
  • Cho phép bạn chọn mã hóa tập tin văn bản. Cũng có một tùy chọn tự động phát hiện.

Tải xuống FNR tại đây: http://findandreplace.io/?z=codeplex

Ví dụ sử dụng: fnr --cl --dir "<Directory Path>" --fileMask "hibernate.*" --useRegEx --find "find_str_expression" --replace "replace_string"


1
Cái này đẹp đấy. Có thể tạo dòng lệnh từ gui là một tính năng đơn giản tuyệt vời giúp tôi đi nhanh chóng.
David Hammond

Công cụ rất hữu ích. Đã thử FART trước nhưng tài liệu đã hết hạn.
Artur Kędzior

Công cụ tuyệt vời, nó thậm chí còn hỗ trợ biểu hiện thông thường. Đây là điều mà FART đang thiếu.
Dio Phung

1
Cảm ơn đã chỉ ra công cụ này. Exe đơn, thay thế tuyệt vời cho FART không còn được phát triển (và bỏ lỡ regex); và cú pháp PowerShell không thể chịu đựng được.
Gras Double

Điều này là hữu ích nhất. Đã tìm kiếm grep + sed thay thế trong windows, điều này làm việc rất tốt!
Serban Tanasa

25

Tôi không nghĩ có cách nào để làm điều đó với bất kỳ lệnh tích hợp nào. Tôi sẽ đề nghị bạn tải xuống một cái gì đó như Gnuwin32 hoặc UnxUtils và sử dụng sedlệnh (hoặc chỉ tải xuống sed):

sed -c s/FOO/BAR/g filename

2
Sử dụng cygwin ( cygwin.com ). Đây là điều tốt nhất tiếp theo để thực sự cài đặt linux.
Andrew Johnson

Sẽ tốt hơn nếu người ta có thể cung cấp một giải pháp không phụ thuộc vào việc cài đặt cygwin. Thao tác chuỗi POSIX là không có trí tuệ - thực hiện điều này trên Windows khó hiểu hơn một chút.
Rex

4
Gnuwin32 và UnxUtils là các nhị phân độc lập được xây dựng cho Windows. Họ không phụ thuộc vào cygwin.
Ferruccio

1
cygwin: sed -i -b -e 's/FOO/BAR/g' `find . -name *.txt`-i - chỉnh sửa tập tin tại chỗ; -b - không xử lý CR + LF - nếu không có tùy chọn này, CR + LF sẽ được chuyển đổi thành LF
Alexey Vishentsev

@AndrewJohnson Ý kiến ​​và thông tin là hai điều khác nhau.
Preza8

21

Tôi biết tôi đến bữa tiệc muộn ..

Cá nhân, tôi thích giải pháp tại: - http://www.dostips.com/DtTipsStringManipulation.php#Snippets.Replace

Chúng tôi cũng vậy, sử dụng rộng rãi Chức năng Dedupe để giúp chúng tôi gửi khoảng 500 email mỗi ngày qua SMTP từ: - https://groups.google.com/forum/#!topic/alt.msdos.batch.nt/sj8IUhMOq6o

và cả hai đều hoạt động tự nhiên mà không cần thêm công cụ hoặc tiện ích.

TRẢ LỜI:

DEL New.txt
setLocal EnableDelayedExpansion
For /f "tokens=* delims= " %%a in (OLD.txt) do (
Set str=%%a
set str=!str:FOO=BAR!
echo !str!>>New.txt
)
ENDLOCAL

DEDUPLICATOR (lưu ý sử dụng -9 cho số ABA):

REM DE-DUPLICATE THE Mapping.txt FILE
REM THE DE-DUPLICATED FILE IS STORED AS new.txt

set MapFile=Mapping.txt
set ReplaceFile=New.txt

del %ReplaceFile%
::DelDupeText.bat
rem https://groups.google.com/forum/#!topic/alt.msdos.batch.nt/sj8IUhMOq6o
setLocal EnableDelayedExpansion
for /f "tokens=1,2 delims=," %%a in (%MapFile%) do (
set str=%%a
rem Ref: http://www.dostips.com/DtTipsStringManipulation.php#Snippets.RightString
set str=!str:~-9!
set str2=%%a
set str3=%%a,%%b

find /i ^"!str!^" %MapFile%
find /i ^"!str!^" %ReplaceFile%
if errorlevel 1 echo !str3!>>%ReplaceFile%
)
ENDLOCAL

Cảm ơn!


tập lệnh bó không làm gì ngoài một bản sao tập tin đơn thuần - cũng: tại sao bạn lại cảm ơn chính mình?
đặc biệt

Yêu cầu ban đầu là thay thế "FOO" bằng "BAR" trong tệp văn bản bằng cách sử dụng tập lệnh bó và với các chức năng tích hợp tốt nhất. Nếu bất cứ điều gì tôi cảm ơn bài đăng trên Google Groups tôi đã tìm thấy hoạt động tuyệt vời và chúng tôi vẫn sử dụng nó cho đến ngày nay. Ngoài ra, hãy xem các bài đăng và phản hồi như thế này cũng hữu ích cho người dùng. Tôi không thấy bình luận của bạn về sao chép tập tin Tôi khuyên bạn nên thử nó trước. ;)
Leptonator

về cơ bản, nó là một công cụ sao chép tệp thay thế hai chuỗi tĩnh - ít nhất bạn có thể đặt hai biến trong đó để những người muốn thử không cần phải hiểu cú pháp để thực sự có thể sử dụng nó - cũng: các giả định trên internet hầu như luôn luôn hoàn toàn sai. Nhớ lấy.
đặc biệt

4
@specializt - Xin vui lòng ... Tôi không ở đây để tranh luận về ngữ nghĩa. Nếu bạn thích, chúng tôi có thể đưa ngoại tuyến này vào phòng trò chuyện.
Leptonator

2
Theo tôi, đây là câu trả lời cho câu hỏi ban đầu. Tôi sẽ sử dụng mẹo này để định cấu hình các tệp khởi tạo cho một dịch vụ trong khi thiết lập và tôi không muốn bật PowerShell hoặc cho phép công cụ tập lệnh chạy trên máy chủ của mình. Vì vậy, thường trả lời các câu hỏi liên quan đến windows, hãy bắt đầu với "cài đặt gizmo này từ đó" vì vẫn còn thái độ "PC" xung quanh.
mico

15

Khi bạn làm việc với Git trên Windows thì chỉ cần khởi động git-bash và sử dụng sed. Hoặc, khi sử dụng Windows 10, hãy khởi động "Bash trên Ubuntu trên Windows" (từ hệ thống con Linux) và sử dụng sed.

Đây là trình chỉnh sửa luồng, nhưng có thể chỉnh sửa tệp trực tiếp bằng cách sử dụng lệnh sau:

sed -i -e 's/foo/bar/g' filename
  • -i tùy chọn được sử dụng để chỉnh sửa tại chỗ trên tên tệp.
  • -e tùy chọn chỉ ra một lệnh để chạy.
    • sđược sử dụng để thay thế biểu thức tìm thấy "foo" bằng "bar" và gđược sử dụng để thay thế bất kỳ kết quả tìm thấy nào.

Lưu ý bởi ereOn:

Nếu bạn muốn thay thế một chuỗi trong các tệp được phiên bản chỉ của kho Git, bạn có thể muốn sử dụng:

git ls-files <eventual subfolders & filters> | xargs sed -i -e 's/foo/bar/g'

mà làm việc kỳ diệu.


1
Lưu ý rằng nếu bạn thực sự thực hiện việc đổi tên đó trong kho git và chỉ muốn thay thế trong các tệp được phiên bản, bạn có thể muốn làm: git ls-files <eventual subfolders & filters> | xargs sed -i -e 's/foo/bar/g'điều này thật tuyệt vời.
vào

13

Tôi đã chơi xung quanh với một số câu trả lời hiện có ở đây và thích giải pháp cải tiến của mình ...

type test.txt | powershell -Command "$input | ForEach-Object { $_ -replace \"foo\", \"bar\" }"

hoặc nếu bạn muốn lưu lại đầu ra vào một tệp ...

type test.txt | powershell -Command "$input | ForEach-Object { $_ -replace \"foo\", \"bar\" }" > outputFile.txt

Lợi ích của việc này là bạn có thể đầu ra từ bất kỳ chương trình nào. Sẽ xem xét sử dụng các biểu thức thông thường với điều này quá. Không thể tìm ra cách biến nó thành tệp BAT để dễ sử dụng hơn ... :-(


3
Đây là một giải pháp tốt. Thật không may, sử dụng typecó nghĩa là tất cả các dòng lớn hơn 80 ký tự được gói. Thật là một nỗi đau.
sirdank 16/2/2015

12

Tôi đã sử dụng perl, và nó hoạt động tuyệt vời.

perl -pi.orig -e "s/<textToReplace>/<textToReplaceWith>/g;" <fileName>

.orig là phần mở rộng nó sẽ nối vào tệp gốc

Đối với một số tệp phù hợp, chẳng hạn như * .html

for %x in (<filePattern>) do perl -pi.orig -e "s/<textToReplace>/<textToReplaceWith>/g;" %x

Đây là giải pháp đơn giản nhất +1, khi chuyển đổi từ sh để dơi, chỉ cần thay thế sedvới perl -pi.backup -evà đánh giá cao nó :)
Yann39

11

Với replacer.bat

1) Với e?tùy chọn sẽ đánh giá các chuỗi ký tự đặc biệt như \n\rvà chuỗi unicode. Trong trường hợp này sẽ thay thế trích dẫn "Foo""Bar":

call replacer.bat "e?C:\content.txt" "\u0022Foo\u0022" "\u0022Bar\u0022"

2) Thay thế đơn giản nơi FooBarkhông được trích dẫn.

call replacer.bat "C:\content.txt" "Foo" "Bar"

nó không làm việc cho tôi Làm thế nào để bạn chạy này? Tôi đang nhận được lỗi 'thay_in_config.bat' không được nhận dạng dưới dạng lệnh nội bộ hoặc bên ngoài, chương trình có thể hoạt động hoặc tệp bó.
FrenkyB

@FrenkyB - nó cần nằm trong cùng thư mục mà bạn gọi nó hoặc trong đường dẫn - ss64.com/nt/path.html
npocmaka

Tôi đã có tất cả ba tập tin trong cùng một thư mục.
FrenkyB

9

Đây là một giải pháp mà tôi thấy đã hoạt động trên Win XP. Trong tệp bó đang chạy của tôi, tôi bao gồm các mục sau:

set value=new_value

:: Setup initial configuration
:: I use && as the delimiter in the file because it should not exist, thereby giving me the whole line
::
echo --> Setting configuration and properties.
for /f "tokens=* delims=&&" %%a in (config\config.txt) do ( 
  call replace.bat "%%a" _KEY_ %value% config\temp.txt 
)
del config\config.txt
rename config\temp.txt config.txt

Các replace.battập tin như dưới đây. Tôi không tìm thấy cách bao gồm hàm đó trong cùng một tệp bó, bởi vì %%abiến này dường như luôn đưa ra giá trị cuối cùng trong vòng lặp for.

replace.bat:

@echo off

:: This ensures the parameters are resolved prior to the internal variable
::
SetLocal EnableDelayedExpansion

:: Replaces Key Variables
::
:: Parameters:
:: %1  = Line to search for replacement
:: %2  = Key to replace
:: %3  = Value to replace key with
:: %4  = File in which to write the replacement
::

:: Read in line without the surrounding double quotes (use ~)
::
set line=%~1

:: Write line to specified file, replacing key (%2) with value (%3)
::
echo !line:%2=%3! >> %4

:: Restore delayed expansion
::
EndLocal

1
Đáng buồn là điều này cũng bỏ qua các dòng trống. Một tính năng của lệnh {{for}}.
John Rocha

7

Hãy xem Có bất kỳ tiện ích như sed nào cho cmd.exe yêu cầu một sed tương đương trong Windows, cũng nên áp dụng cho câu hỏi này. Tóm tắt điều hành:

  • Nó có thể được thực hiện trong tệp bó, nhưng nó không đẹp
  • Rất nhiều chương trình thực thi của bên thứ ba có sẵn sẽ làm điều đó cho bạn, nếu bạn có sự cài đặt sang trọng hoặc chỉ sao chép qua một exe
  • Có thể được thực hiện với VBScript hoặc tương tự nếu bạn cần một cái gì đó có thể chạy trên hộp Windows mà không cần sửa đổi, v.v.

4

Có thể hơi muộn một chút, nhưng tôi thường xuyên tìm kiếm những thứ tương tự, vì tôi không muốn vượt qua nỗi đau để được phê duyệt phần mềm.

Tuy nhiên, bạn thường sử dụng câu lệnh FOR dưới nhiều hình thức khác nhau. Ai đó đã tạo một tệp bó hữu ích thực hiện tìm kiếm và thay thế. Có một cái nhìn ở đây . Điều quan trọng là phải hiểu những hạn chế của tệp bó được cung cấp. Vì lý do này, tôi không sao chép mã nguồn trong câu trả lời này.


4

Hai tệp bó cung cấp các search and replacehàm đã được các thành viên Stack Overflow ghi dbenhamaacinisử dụng native built-in jscripttrong Windows.

Chúng là cả hai robustvà được very swift with large filesso sánh với kịch bản hàng loạt đơn giản, và cũng được simplersử dụng để thay thế văn bản cơ bản. Cả hai đều có Windows regular expressionmẫu phù hợp.

  1. Tập sed-liketin lô trợ giúp này được gọi repl.bat(bởi dbenham).

    Ví dụ sử dụng Lchuyển đổi theo nghĩa đen:

    echo This is FOO here|repl "FOO" "BAR" L
    echo and with a file:
    type "file.txt" |repl "FOO" "BAR" L >"newfile.txt"
    
  2. Tập grep-liketin lô trợ giúp này được gọi findrepl.bat(bởi aacini).

    Ví dụ có biểu thức chính quy hoạt động:

    echo This is FOO here|findrepl "FOO" "BAR" 
    echo and with a file:
    type "file.txt" |findrepl "FOO" "BAR" >"newfile.txt"
    

Cả hai đều trở thành các tiện ích toàn hệ thống mạnh mẽ when placed in a folder that is on the pathhoặc có thể được sử dụng trong cùng một thư mục với tệp bó hoặc từ dấu nhắc cmd.

Cả hai đều có case-insensitivecông tắc và cũng có nhiều chức năng khác.


3

Lệnh Power shell hoạt động như một lá bùa

(
test.txt | ForEach-Object { $_ -replace "foo", "bar" } | Set-Content test2.txt
)

3

Chỉ gặp phải một vấn đề tương tự - "Tìm kiếm và thay thế văn bản trong các tệp", nhưng ngoại trừ rằng đối với cả tên tệp và tìm kiếm / trả lời tôi cần sử dụng regex. Bởi vì tôi không quen thuộc với Powershell và muốn lưu các tìm kiếm của mình để sử dụng sau này, tôi cần một cái gì đó "thân thiện với người dùng" hơn (tốt hơn nếu nó có GUI).

Vì vậy, trong khi Googling :) tôi đã tìm thấy một công cụ tuyệt vời - FAR (Tìm và thay thế) (không phải FART).

Chương trình nhỏ đó có GUI đẹp và hỗ trợ regex để tìm kiếm trong tên tệp và trong tệp. Chỉ có điều không hài lòng là nếu bạn muốn lưu cài đặt của mình, bạn phải chạy chương trình với tư cách quản trị viên (ít nhất là trên Win7).


Đó là câu trả lời giống như câu trả lời từ năm 2010 @VonC Trong chủ đề này
jeb

@jeb Tôi đã chỉ ra rằng FAR không phải là FART - hai chương trình khác nhau có tên gần như giống hệt nhau. FAR có GUI và có thể hoạt động với regex, trong khi trong các bình luận bên dưới chủ đề mà mọi người đề cập rằng FART không hỗ trợ regex.
madcorp

3

Tôi thích sử dụng sedtừ các tiện ích GNU cho Win32 , những điều sau đây cần được lưu ý

  • trích dẫn duy nhất ''sẽ không làm việc trong các cửa sổ, sử dụng ""thay thế
  • sed -iSẽ không hoạt động trong windows, nó sẽ cần hoán đổi tập tin

Vì vậy, mã làm việc sedđể tìm và thay thế văn bản trong một tệp trong windows là như dưới đây

sed -e "s/foo/bar/g" test.txt > tmp.txt && mv tmp.txt test.txt

2
Trước khi người dùng Windows ngay lập tức hoán đổi tập tin: phiên bản mới hơn của sed hỗ trợ chỉnh sửa tại chỗ với -i! Nếu phiên bản sed của bạn không, thì hãy kiểm tra lệnh từ câu trả lời này: stackoverflow.com/a/33762001/2492801 .
Benjamin Bihler

2

Đây là một điều mà kịch bản hàng loạt không làm tốt.

Kịch bản morechilli được liên kết đến sẽ hoạt động đối với một số tệp, nhưng thật không may, nó sẽ bị nghẹt trên những tệp có chứa các ký tự như ống dẫn và ký hiệu.

VBScript là một công cụ tích hợp tốt hơn cho tác vụ này. Xem bài viết này để biết ví dụ: http://www.microsoft.com/technet/scriptcenter/resource/qanda/feb05/hey0208.mspx


2

@Rachel đã đưa ra một câu trả lời xuất sắc nhưng đây là một biến thể của nó để đọc nội dung thành một $databiến powershell . Sau đó, bạn có thể dễ dàng thao tác nội dung nhiều lần trước khi ghi vào tệp đầu ra. Cũng xem cách các giá trị nhiều dòng được đưa ra trong một tệp bó .bat.

@REM ASCII=7bit ascii(no bom), UTF8=with bom marker
set cmd=^
  $old = '\$Param1\$'; ^
  $new = 'Value1'; ^
  [string[]]$data = Get-Content 'datafile.txt'; ^
  $data = $data -replace $old, $new; ^
  out-file -InputObject $data -encoding UTF8 -filepath 'datafile.txt';
powershell -NoLogo -Noninteractive -InputFormat none -Command "%cmd%"

2

Sử dụng powershell trong .bat - cho Windows 7+

mã hóa utf8 là tùy chọn, tốt cho các trang web

@echo off
set ffile='myfile.txt'
set fold='FOO'
set fnew='BAR'
powershell -Command "(gc %ffile%) -replace %fold%, %fnew% | Out-File %ffile% -encoding utf8"

1

Tải xuống Cygwin (miễn phí) và sử dụng các lệnh giống như unix tại dòng lệnh Windows.

Đặt cược tốt nhất của bạn: sed


10
Cygwin là ác quỷ. Đừng cài đặt nó. Sử dụng tốt hơn UnixUtils được đề cập dưới đây.
zedoo

24
Điều gì là xấu xa về nó?
jm.

@jm Có thể là do bạn phải cài đặt toàn bộ cùng nhau thay vì sử dụng một tệp thực thi bất cứ khi nào bạn muốn.
Andry

Sử dụng tốt hơn powershell, nó thực sự được tích hợp trong các cửa sổ.
Preza8

0

Cũng có thể xem các công cụ Thay thế và Thay thế Bộ lọc tại https://zoomicon.github.io/tranXform/ (bao gồm nguồn). Cái thứ 2 là một bộ lọc.

Công cụ thay thế các chuỗi trong các tệp nằm trong VBScript (cần Windows Script Host [WSH] để chạy trong các phiên bản Windows cũ)

Bộ lọc có thể không hoạt động với Unicode trừ khi bạn biên dịch lại với Delphi mới nhất (hoặc với FreePascal / Lazarus)


-5

Tôi đã phải đối mặt với vấn đề này nhiều lần trong khi mã hóa theo Visual C ++. Nếu bạn có nó, bạn có thể sử dụng Visual studio Find and Thay thế Utility. Nó cho phép bạn chọn một thư mục và thay thế nội dung của bất kỳ tệp nào trong thư mục đó bằng bất kỳ văn bản nào bạn muốn.

Trong Visual Studio: Chỉnh sửa -> Tìm và thay thế Trong hộp thoại đã mở, chọn thư mục của bạn và điền vào ô "Tìm gì" và "Thay thế bằng". Hy vọng điều này sẽ hữu ích.


2
Nadjib, câu trả lời của bạn không giúp ích gì cho người dùng vì bạn cho rằng họ đang sử dụng phần mềm mà họ không đề cập đến. Vui lòng đề xuất một tùy chọn không yêu cầu phần mềm.
Aibrean

@Aibrean câu trả lời là không sử dụng, nhưng không phải vì lý do đó, đó là điểm vào sai.
Paul
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.