Thay thế chuỗi trong tệp hàng loạt


102

Chúng tôi có thể thay thế các chuỗi trong một tệp hàng loạt bằng lệnh sau

set str="jump over the chair"
set str=%str:chair=table%

Những dòng này hoạt động tốt và thay đổi chuỗi "nhảy qua ghế" thành "nhảy qua bàn". Bây giờ tôi muốn thay thế từ "ghế" trong chuỗi bằng một số biến và tôi không biết phải làm như thế nào.

set word=table
set str="jump over the chair"
??

Bất kỳ ý tưởng?


có thể trùng lặp của làm thế nào để thay thế chuỗi bên trong một file bat với chuỗi tham số dòng lệnh trong đó có chính thức nhiều hơn nữa câu trả lời (nó có những giải pháp tương tự như các câu trả lời ở đây mặc dù)
Fr0sT

1
bây giờ nó không quan trọng ai là đầu tiên, nhưng nó tốt để liên kết câu hỏi giống hệt nhau và trỏ đến câu trả lời irrefragable nhất
Fr0sT

Câu trả lời:


79

Bạn có thể sử dụng !, nhưng bạn phải đặt công tắc ENABLEDELAYEDEXPANSION.

setlocal ENABLEDELAYEDEXPANSION
set word=table
set str="jump over the chair"
set str=%str:chair=!word!%

4
Nhưng nếu strbản thân nó là từ việc mở rộng bị trì hoãn thì sao? set str=!str:chair=!word!!không hoạt động chính xác.
ImaginaryHuman072889

Tôi hiểu "jump over the !word!".
bers

88

Bạn có thể sử dụng thủ thuật nhỏ sau:

set word=table
set str="jump over the chair"
call set str=%%str:chair=%word%%%
echo %str%

Điều callđó gây ra một lớp mở rộng biến đổi khác, khiến cần phải trích dẫn các %dấu hiệu ban đầu nhưng cuối cùng tất cả đều hoạt động.


Tôi thích giải pháp này, thoát chuỗi luôn có vấn đề trong các tệp hàng loạt, ENABLEDELAYEDEXPANSION chỉ cần thêm một ký tự khác để lo lắng.
Anders

9
Điều quan trọng liên quan đến câu trả lời do Joey cung cấp . Đó là bạn cần đặt mã vào tệp hàng loạt để nó hoạt động. Nếu bạn chỉ kiểm tra nó trong dòng lệnh, nó sẽ trả về không mong muốn %"jump over the "word%%%. Chỉ cần lưu ý, mã đó trong các tệp hàng loạt và trong dòng lệnh có thể tạo ra các kết quả khác nhau.
dadhi

2
Dựa trên nhận xét tại chỗ của dadhi, giải pháp cho dòng lệnh là ở đây: stackoverflow.com/questions/29944902/… .
Kenn Sebesta

2
Upvoting câu trả lời này bởi vì nó hoạt động cả hai cách, với các biến môi trường trong cả hai vị trí, hoặc ở cả hai trạng thái "trước" và "sau" các vị trí: set word=table set str="jump over the chair" call set str=%%str:chair=%word%%% echo %str% set word1=chair set word2=desk set str="jump over the chair" call set str=%%str:%word1%=%word2%%% echo %str%'
Tom Warfield

0

Tôi đã có thể sử dụng Joey's Answer để tạo một hàm:

Sử dụng nó như:

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

SET "MYTEXT=jump over the chair"
echo !MYTEXT!
call:ReplaceText "!MYTEXT!" chair table RESULT
echo !RESULT!

GOTO:EOF

Và các Chức năng này ở cuối tệp Batch của bạn.

:FUNCTIONS
@REM FUNCTIONS AREA
GOTO:EOF
EXIT /B

:ReplaceText
::Replace Text In String
::USE:
:: CALL:ReplaceText "!OrginalText!" OldWordToReplace NewWordToUse  Result
::Example
::SET "MYTEXT=jump over the chair"
::  echo !MYTEXT!
::  call:ReplaceText "!MYTEXT!" chair table RESULT
::  echo !RESULT!
::
:: Remember to use the "! on the input text, but NOT on the Output text.
:: The Following is Wrong: "!MYTEXT!" !chair! !table! !RESULT!
:: ^^Because it has a ! around the chair table and RESULT
:: Remember to add quotes "" around the MYTEXT Variable when calling.
:: If you don't add quotes, it won't treat it as a single string
::
set "OrginalText=%~1"
set "OldWord=%~2"
set "NewWord=%~3"
call set OrginalText=%%OrginalText:!OldWord!=!NewWord!%%
SET %4=!OrginalText!
GOTO:EOF

Và hãy nhớ rằng bạn PHẢI thêm "SETLOCAL ENABLEDELAYEDEXPANSION" vào đầu tệp hàng loạt của bạn, nếu không cái nào trong số này sẽ hoạt động bình thường.

SETLOCAL ENABLEDELAYEDEXPANSION
@REM # Remember to add this to the top of your batch file.

-4

Cái này hoạt động tốt

@echo off    
set word=table    
set str=jump over the chair    
set rpl=%str:chair=%%word%    
echo %rpl%

5
Xin lỗi, nó có vẻ tốt, NHƯNG nó sai! Nó loại bỏ từ chairvà nối từ table, nhưng nó không trao đổi hai từ. Cố gắng thay thế từ overbằng undervà bạn nhận đượcjump the chairunder
jeb
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.