标题: 請文如何將一的檔案中的某一行文字換成你需要的文字
[打印本页]
作者: 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 将空格补齐即可。
今天没有太多时间了,如果你确实需要,而又没有其它达人提供方案,可以考虑深入研究一下。