iT邦幫忙

1

請問BAT 如何可模糊取代文件字串

  • 分享至 

  • xImage

文件內容

# 測試標題
Show # 12131212 change[title] == "run time" # [test] == "true"
Hide # 54899849 change[title] == "run time" # [test] == "true"

需求內容



[title] == "run time" # [test] == "true"

// #  change[title] == "run time" # [test] == "true"

條件:

  1. 第一行 為# 則刪除整行內容 ---遇到#無效
    2. set "a=!a:#*=!"
  2. 第一行 為Show 則模糊取代 Show*change 為空白 --指令無效
    3. set "a=!a:Show * change=!"
  3. 第一行 為Hide 則將hide取代為// ---已經完成
    4. set "a=!a:Hide=//!"
@echo off
REM UTF-8
chcp 65001
rem 定義變數延遲環境,關閉回顯
@echo off&setlocal enabledelayedexpansion
rem 讀取a.txt所有內容
for /f "eol=* tokens=*" %%i in (1.filter) do (
rem 設定變數a為每行內容
set a=%%i
rem 如果該行有Hide,則將其改為//
set "a=!a:Hide=//!"
rem 把修改後的全部行存入$
echo !a!>>$)
rem 用$的內容替換原來a.txt內容
move $ 1.filter

用正則置換
https://stackoverflow.com/questions/14856009/win-batch-regexp-search-and-replace
partylin iT邦新手 5 級 ‧ 2021-03-02 13:49:46 檢舉
感謝~來看看
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

0
nwm310
iT邦新手 3 級 ‧ 2021-02-26 22:14:15
最佳解答
  • chcp 65001
    bat、txt的編碼格式:utf8 沒有BOM的

  • for /f
    不會讀取空行

  • for /f eol值
    先以delims 的值去切割
    如果第一段的第一個字,和 eol值一樣,就跳過這一行
    eol值的預設值是分號(;)

  • %%i 的值

    • 如果 %%i 含有驚嘆號
      先寫 set "a=%%i"
      再寫 setlocal enabledelayedexpansion
      避免 %%i的值 含有 !var! 再變一次
  • 模糊取代
    只有當*是第一字時,才可以模糊取代(非貪婪)
    %var:*Old=New%
    至於Show*change 這種形式,就要另外想辦法了

@echo off
REM UTF-8
chcp 65001


rem 第一段第一個字為# 則略過這一行
for /f "eol=# delims=" %%i in (1.filter) do (
    rem 設定變數a為每行內容
    set "a=%%i"

    rem 定義變數延遲環境
    setlocal enabledelayedexpansion

    rem 如果該行有Hide,則將其改為//
    set "a=!a:Hide=//!"

    rem 一行的前4個字是Show。模糊取代 Show*change 為空
    rem 另一種寫法:更多檢查 set "a=!a:* change[=[!"
    if "!a:~0,4!" == "Show" set "a=!a:*change=!"

    rem 把修改後的全部行存入$
    echo !a!>>$

    endlocal
)

rem 用$的內容替換原來txt內容
move $ 1.filter
partylin iT邦新手 5 級 ‧ 2021-03-02 13:49:34 檢舉

感謝教學,已解決
不過第一段第一個字為# 則略過這一行(其實也是要刪除的)

不過改不好在底下增加
直接在底下增加下列解決
set "a=!a:*指定完整字串=//!"

我要發表回答

立即登入回答