Board logo

标题: 請文如何將一的檔案中的某一行文字換成你需要的文字 [打印本页]

作者: dosfroum     时间: 2005-12-7 13:04    标题: 請文如何將一的檔案中的某一行文字換成你需要的文字

假如有一檔案 Try.txt內容如下
AAA    = 10.7
BBB    = 11.6
CCC    = 13.4
DDD    = 15.8
EEE    = 17.1
如果要用批次檔的方次把
"CCC    = 13.4"
這行至換成
"CCC    = 55.33"
這樣子應該要如何寫

謝謝
作者: dosfroum     时间: 2005-12-11 10:57
這個問題應該會有不少人遇到
或者是需要
是太簡單了 還是 無解阿
都沒消沒息的@@
作者: Wengier     时间: 2005-12-11 11:29
允許使用第三方工具麼?如果允許的話,可以試試XCHANGE之類的工具,一行就可以解決。例如試試這條命令(XCHANGE見附件):

XCHANGE Try.txt "CCC    = 13.4" "CCC    = 55.33"
附件 1: XCHANGE.EXE (2005-12-11 11:31, 22.04 K, 下载附件所需积分 1点 ,下载次数: 94)

作者: zreo     时间: 2005-12-11 14:30
有这个工具的应用祥解吗?
作者: arding     时间: 2006-1-12 20:18

@echo off & setlocal EnableDelayedExpansion
echo.>n_try.txt
for /f "tokens=1,2,3*" %%i in (try.txt) do set var1=%%i && if "CCC " == "!var1!" (echo CCC    = 55.33>>n_try.txt) else (echo %%i    %%j %%k>>n_try.txt)
pause

作者: gmy     时间: 2006-1-13 14:00
我用 HEXC,只有5KB,比XCHANGE更小巧,但功能简单了一些,够用了。
hexc Try.txt Try.txt "CCC    = 13.4" "CCC    = 55.33" /u
附件 1: HEXC.rar (2006-1-13 14:00, 4.21 K, 下载附件所需积分 1点 ,下载次数: 57)

作者: vptdosme     时间: 2006-1-14 22:17
最好不要使用第三方工具,否则无法实现批处理的价值
作者: willsort     时间: 2006-1-15 20:06
Re vptdosme:

      arding 兄在5楼提供的程序,即是 CMD 下没有使用第三方程序,若想在 Win9x/DOS 下实现,则会复杂很多,需要使用文本遍历算法或者利用ASCII汇编器echo出一个类似的替换程序进行替换,除非确有必要,一般不建议采用。
作者: dosfroum     时间: 2006-2-16 09:57


  Quote:
Originally posted by Wengier at 2005-12-11 11:29:
允許使用第三方工具麼?如果允許的話,可以試試XCHANGE之類的工具,一行就可以解決。例如試試這條命令(XCHANGE見附件):

XCHANGE Try.txt "CCC     ...

對不起這個方好好像不行
因為 CCC    =12.5  #TEST
要是 CCC       =12.5   #TEST
每個人修改後的空格數不固定所以我的標題才會寫
修改特定一行資料
而版大提出來的是字串 所以可否幫忙解決一下
謝謝
作者: dosfroum     时间: 2006-2-16 10:09


  Quote:
Originally posted by arding at 2006-1-12 20:18:
@echo off & setlocal EnableDelayedExpansion
echo.>n_try.txt
for /f "tokens=1,2,3*" %%i in (try.txt) do set var1=%%i && if "CCC " == "!var1!" (ec ...

這個方式的確可以修改 但是有個問題 他會砍資料 就是當你的空格適用TAB鍵產生的 後段的資料全部砍掉 有辦法克服嗎 謝謝
修改 11b_ATTEN_DUT_PM   這行


原始資料
11b_ATTEN_DUT_SA              = 15.5;        # Attenuation at 2.5GHz between DUT and spectrum analyzer (double)
11b_ATTEN_FIXED_DUT_GOLDEN    = 41.8;   # Fixed attenuation at 2.5GHz between DUT and GOLDEN (double)
11b_ATTEN_DUT_PM              = 21.4;          # Attenuation at 2.5GHz between DUT and power meter (double)
執行後資料
11b_ATTEN_DUT_SA    = 15.5;
11b_ATTEN_FIXED_DUT_GOLDEN    = 41.8;
11b_ATTEN_DUT_PM    = 33.55;

作者: willsort     时间: 2006-2-16 11:45
Re dosfroum:

      这与 tab 没有什么关系,for /f 缺省时是承认 tab 作为切分符的。主要是因为原程序中遗漏了 %%l 的输出。例句如下:
@echo off
if exist tabo.txt del tabo.txt
for /f "tokens=1,2,3*" %%i in (tab.txt) do (
    if "%%i"=="11b_ATTEN_DUT_PM" (echo %%i   %%j 33.55 %%l>>tabo.txt) else (echo %%i   %%j %%k %%l>>tabo.txt)
)

作者: 220110     时间: 2006-2-16 22:52
Re willsort:

你的程序有小失误,把分号给丢失了。另,程序没有产生 dosfroum 希望的“执行后资料”;而把后边注释跟进了。
作者: willsort     时间: 2006-2-17 09:02
Re 220110:

      分号确实是我的疏忽,时间所限,没有进行严格的测试。至于注释,我的理解是 dosfroum 兄是希望保留着些注释信息的,至于这些信息失去了原来的对齐效果,那就是 for /f 的局限所在了,可以考虑将%%i %%j %%k %%l 之间的空格改为Tab,但是效果仍然未必十分理想。如果使用 awk 的话,就可以使用类似C语言 printf 的函数来实现文本对齐了。
作者: dosfroum     时间: 2006-2-17 15:25
請問可以改成 除了 那行以外的資料能不去變動嗎
好多空白被拿掉了 不過已經比之前的好很多了
感謝!!

執行前
11b_ATTEN_DUT_SA              = 15.5;        # Attenuation at 2.5GHz between DUT and spectrum analyzer (double)
11b_ATTEN_FIXED_DUT_GOLDEN    = 41.8;           # Fixed attenuation at 2.5GHz between DUT and GOLDEN (double)
11b_ATTEN_DUT_PM              = 21.4;          # Attenuation at 2.5GHz between DUT and power meter (double)

   2442                  0        -85        0         -90        1        1111        0                0        6.0
#   2447                  1        -85        0         -90        0        1111        0                1        6.0
#   2452                  1        -85        0         -90        0        1111        0                1        6.0
#   2457                  1        -85        0         -90        0        1111        0                1        6.0
#   2462                  1        -85        0         -90        0        1111        0                1        6.0
#   2467                  1        -85        0         -90        0        1111        0                1        6.0
#  2472                  1        -85        0         -90        0        1111        0                1        6.0
   2484                  1        -85        0         -90        0        1111        0                1        6.0
執行後
11b_ATTEN_DUT_SA   = 15.5; # Attenuation at 2.5GHz between DUT and spectrum analyzer (double)
11b_ATTEN_FIXED_DUT_GOLDEN   = 41.8; # Fixed attenuation at 2.5GHz between DUT and GOLDEN (double)
11b_ATTEN_DUT_PM   = 33.55 # Attenuation at 2.5GHz between DUT and power meter (double)

2442   0 -85 0         -90        1        1111        0                0        6.0
#   2447 1 -85        0         -90        0        1111        0                1        6.0
#   2452 1 -85        0         -90        0        1111        0                1        6.0
#   2457 1 -85        0         -90        0        1111        0                1        6.0
#   2462 1 -85        0         -90        0        1111        0                1        6.0
#   2467 1 -85        0         -90        0        1111        0                1        6.0
#   2472 1 -85        0         -90        0        1111        0                1        6.0

作者: dosfroum     时间: 2006-2-17 15:44
對不起
發現另外一個問題
第一格的空白會增加
且值沒有修改到

批次檔
@Echo on
C:
CD\
attrib -R -S -A -H boot.ini
copy boot.ini+boot.txt Boot.ini

if exist temp.txt del temp.txt
for /f "tokens=1,2,3*" %%i in (boot.ini) do (
    if "%%i"=="timeout" (echo %%i   %%j 3 %%l>>temp.txt) else (echo %%i   %%j %%k %%l>>temp.txt)
)

attrib +S +A +H boot.ini

rem del addboot.bat
原始檔
[boot loader]
timeout=35
default=multi(0)disk(0)rdisk(0)partition(1)\WINNT
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINNT="Microsoft Windows 2000 Professional" /fastdetect
批處理後
[boot   loader]  
timeout=35     
default=multi(0)disk(0)rdisk(0)partition(1)\WINNT     
[operating   systems]  
multi(0)disk(0)rdisk(0)partition(1)\WINNT="Microsoft   Windows 2000 Professional" /fastdetect
C:\ieldr="Boot   From Virtual CD"
[ Last edited by dosfroum on 2006-2-17 at 15:45 ]
作者: dosfroum     时间: 2006-2-17 15:50
發現空白增加的原因是這行
if "%%i"=="timeout" (echo %%i   %%j 3 %%l>>temp.txt) else (echo %%i   %%j %%k %%l>>temp.txt)
%%i   %%j 中間的空白多了兩個 不知道這樣弄得原因在哪邊
我直接把縮短為一個空格 空增加的問題就好了
剩下空白被刪除的問題了 和 值並未被修改
不知道從何解起 謝謝

[ Last edited by dosfroum on 2006-2-17 at 15:51 ]
作者: willsort     时间: 2006-2-17 17:46
Re dosfroum:

      无论是空格增加还是减少,这都属于文本对齐的问题,且都与 for /f 的字符串切分特性有关,解决起来不是很简单,如果现在的结果已经可以应用,建议不要使用更复杂的代码。

      如果确实有必要,可以考虑不使用空格、tab作为字符串切分符,可以考虑使用 = 或者不用切分符,这样就需要使用 set 对字符串进行辅助性“剪接”。

      或者仍使用空格作为切分符,但对每个串项的长度进行检测,并使用 set /a 计算应该填补的空格数,再使用 for+set 将空格补齐即可。

      今天没有太多时间了,如果你确实需要,而又没有其它达人提供方案,可以考虑深入研究一下。