Board logo

标题: [求助]請問大哥們我寫的文本替換更名哪裡有錯?(附圖) [打印本页]

作者: leo1984     时间: 2007-10-31 22:52    标题: [求助]請問大哥們我寫的文本替換更名哪裡有錯?(附圖)
我是新手,剛開始嘗試寫^^"
我有一個目錄的文本,是論壇程序的數據文本


文本以這個作為分隔符

文本內容如下:
流浪漢∥∥搜尋日本AV女優圖片的利器∥http://image.baidu.jp/∥59.113.162.145∥2007/03/21 13:37∥54188@IMYF.COM∥

我想要把每個文本一定要是第一行裡,的2007/03/21 13:37時間的部份用來更改文本檔案名稱

如下圖:


可是我的寫法卻無法完成,請問是哪個地方寫錯了嗎?
麻煩大哥們指導一下,十分感謝^^


@echo off
for /f "delims=" %%f in ('dir /on/b "*.txt"') do (
for /f "tokens=1,2,3,4,5,6,7 delims=∥" %%i in (%%f) do echo %%i∥%%j∥%%k∥%%m∥%%o∥%%n∥%%l∥
&setlocal enabledelayedexpansion
for /f "delims=." %%i in ('dir /on/b *.txt') do (
ren "%%i".txt
)
pause


Last edited by leo1984 on 2007-10-31 at 10:53 PM ]

作者: 1112yuhua     时间: 2007-10-31 23:07
看到你图片里面是“||”而不是“//"

作者: abcd     时间: 2007-10-31 23:16
@echo off
for %%i in (*.txt) do (
for /f "tokens=*" %%a in ('sed "1{s#^.*\(\{4\}/\{2\}/\{2\}\ \{1,\}:\{1,\}\).*$#\1#;q}" "%%i"^|sed "s###g"') do (
ren "%%i" "%%a%%~xi"
)
)

作者: terse     时间: 2007-11-1 01:43
没有太清楚你的意思:你的文本内容如你图片的话 应该是||而不是∥ 这样试试如何?

@echo off &setlocal enabledelayedexpansion
for /f "delims=" %%f in ('dir /on/b "*.txt"') do (
for /f "tokens=6 delims=^|^|" %%i in (%%f) do (
if not defined aaa set aaa=%%i.txt
set aaa=!aaa:/=!
set aaa=!aaa::=:!
set aaa=!aaa: =-!
)
ren %%f !aaa!
)
pause


Last edited by terse on 2007-11-1 at 02:00 AM ]

作者: zh159     时间: 2007-11-1 02:06
修改一下楼上的(如果是||,将∥改为^|即可,tokens=5根据所需字符位置确定):建议先测试正确再实际操作
@echo off
setlocal enabledelayedexpansion
for /f "delims=" %%f in ('dir /on/b "*.txt"') do (
set n=
for /f "tokens=5 delims=∥" %%i in (%%f) do (
set /a n+=1
if !n! == 1 (
set str=%%i
set str=!str:/=!
set str=!str::=!
ren "%%f" "!str!.txt"
)
)
)
pause


Last edited by zh159 on 2007-11-1 at 02:08 AM ]

作者: terse     时间: 2007-11-1 02:30
重新改了一下 我这里是以贴出的试的 是tokens=6 当然这个是无关的 关键能处理就好。前贴没看是第一排的
:流浪漢|| ||搜尋日本AV女優圖片的利器||http://image.baidu.jp/||59.113.162.145||2007/03/20 13:37||54188@IMYF.COM||


@echo off&setlocal enabledelayedexpansion
for %%i in (*.txt) do (
set i=%%i
call :rena
)
pause
goto :eof
:rena
for /f "tokens=6 delims=^|^|" %%i in ('more ^< "%i%"') do (
if not defined line set "line=%%i"
set line=!line:/=!
set line=!line::=!
)
ren "!i!" "!line!.txt"
set line=


Last edited by terse on 2007-11-1 at 02:59 AM ]

作者: leo1984     时间: 2007-11-1 05:31
看來要玩這東西很需要邏輯啊,每位大哥的寫法都不一樣,但都可以成功
我還要多玩玩,不然簡直來這裡開玩笑哩@@

1112yuhua
沒錯的^^

abcd
哈哈,老大哥果然厲害,一測試就成功了,來台灣一定要給我請客啊^^

terse
您的兩次指令都可以成功,只要把參數改符合庵要的即可,第一次的我有測試,但是檔名沒有去除掉一些符號,會變成2007/03/21 13:37.txt
十分感謝大哥^^
@echo off &setlocal enabledelayedexpansion
for /f "delims=" %%f in ('dir /on/b "*.txt"') do (
for /f "tokens=5 delims=" %%i in (%%f) do (
if not defined aaa set aaa=%%i.txt
set aaa=!aaa:/=!
set aaa=!aaa::=:!
set aaa=!aaa: =-!
)
ren %%f !aaa!
)
pause

zh159
您寫的也是每一次都成功,完全沒問題啊^^

只是這串字符是什麼,我研究不出來@@
set aaa=!aaa:/=!
set aaa=!aaa::=:!
set aaa=!aaa: =-!

Last edited by leo1984 on 2007-11-1 at 05:41 AM ]

作者: abcd     时间: 2007-11-1 07:25
∥是一个字符,不是//两个字符啦

楼主还起的真早啊

作者: leo1984     时间: 2007-11-1 07:40
哈哈~我昨晚搞網站很累
就先睡了,今天就比較早起^^

可以順便請問一下,我在更改文本檔名時
發現無法辨識 - 這個字符
所以更改完檔名後,會變成61.224.104.78 - 61.224.104.78.txt

而我不需要讓它辨識 - 這個字符
只要將61.224.104.78 - 61.224.104.78變成61.224.104.78即可

處理前:

0o0∥1∥ Vista風格語言欄&新版聲音圖示&音量控制界面∥安裝完看起來是不錯,但它是簡體字= =!!!,請問大大要如果想改回來要如何改 @0@???∥61.224.104.78 - 61.224.104.78∥2006/11/01 09:23∥zerg0517@yahoo.com.tw

處理後:

0o0∥1∥ Vista風格語言欄&新版聲音圖示&音量控制界面∥安裝完看起來是不錯,但它是簡體字= =!!!,請問大大要如果想改回來要如何改 @0@???∥61.224.104.78∥2006/11/01 09:23∥zerg0517@yahoo.com.tw

我試過再寫一個for抓取∥61.224.104.78 - 61.224.104.78
之間的字符刪除
但是都失敗,請問應該如何寫呢?

Last edited by leo1984 on 2007-11-1 at 07:43 AM ]

作者: abcd     时间: 2007-11-1 08:11
如果IP前的一段中,∥的個數是定的,下面的應該可以的。
for /f "tokens=1,2,3,4,5,6* delims=∥-" %%i in (test.txt) do (
echo %%i∥%%j∥%%k∥%%l∥%%m∥%%o
)

作者: abcd     时间: 2007-11-1 08:22
@echo off
for /f "tokens=1* delims=-" %%i in (test.txt) do (
set "str=%%j"
set "str1=%%i"
call set "str=%%str:*∥=%%"
call echo "%%str1:~0,-1%%∥%%str%%"
)
pause


针对个数不定的,不过因为字符串中有&这个特殊字符,所有输出时必须加""了。

作者: leo1984     时间: 2007-11-1 08:27
大哥,似乎是不行的
∥確實是個定數
- 也是定數

我看此迴圈似乎是找到 ∥- 這個字符對吧?
但是剛才測試沒有反應耶@@

還有大哥您還沒上班或上課嗎?
感謝熱情相助哪^^

作者: leo1984     时间: 2007-11-1 08:29
第二段您給的指令它說

這個時候不應有<

是什麼意思呢@@?

作者: abcd     时间: 2007-11-1 08:29
sed "s/\(\{1,3\}\.\{1,3\}\.\{1,3\}\.\{1,3\}\) - \1/\1/" test.txt


用sed快 多了

作者: abcd     时间: 2007-11-1 08:31
因为我是复制"0o0∥1∥ Vista風格語言欄&新版聲音圖示&音量控制界面∥安裝完看起來是不錯,但它是簡體字= =!!!,請問大大要如果想改回來要如何改 @0@???∥61.224.104.78 - 61.224.104.78∥2006/11/01 09:23∥zerg0517@yahoo.com.tw∥“这一段到记事本处理的。

每一段我都测试过,在我这是可以的。

作者: abcd     时间: 2007-11-1 08:35
第一段的测试结果:
0o0∥1∥ Vista風格語言欄&新版聲音圖示&音量控制界面∥安裝完看起來是不錯,但它是簡體字= =!!!,請問大大要如果想改回來要如何改 @0@???∥61.224.104.78 ∥2006/11/01 09:23∥zerg0517@yahoo.com.tw


第二段的测试结果:
"0o0∥1∥ Vista風格語言欄&新版聲音圖示&音量控制界面∥安裝完看起來是不錯,但它是簡體字= =!!!,請問大大要如果想改回來要如何改 @0@???∥61.224.104.78∥2006/11/01 09:23∥zerg0517@yahoo.com.tw∥"


第三段的测试结果:
0o0∥1∥ Vista風格語言欄&新版聲音圖示&音量控制界面∥安裝完看起來是不錯,但它是簡體字= =!!!,請問大大要如果想改回來要如何改 @0@???∥61.224.104.78∥2006/11/01 09:23∥zerg0517@yahoo.com.tw

作者: leo1984     时间: 2007-11-1 08:41
怪了
老大哥一樣沒有反應耶
三段您給的指令庵都反覆測試,一樣沒有任何反應@@
您說您的是可行的
但是我確定都沒有反應的
sed我也有安裝的

還有剛發現一個也是批處理的站^^
http://bbs.verybat.cn/

作者: abcd     时间: 2007-11-1 08:44
o(∩_∩)o...,我这个只是显示而已,并没有修改文件的。

作者: abcd     时间: 2007-11-1 08:47
还有个www.mybat.cn的,这三个P处理站点是国内比较有名气的P处理站点

不过其它两个都比不上cn-dos的。

作者: leo1984     时间: 2007-11-1 08:51
我是安裝ExeScript V3.0.0_转bat为exe的工具http://mmm.onegreen.net/soft4/ExeScript-v3.0.rar
因為我有安裝卡巴的殺毒軟件
所以將bat轉成exe

請問可能是因為這樣有差別嗎?
可是您之前給的指令都能運行
這次的卻毫無反應呢@@

我在自己試寫看看@@"

作者: abcd     时间: 2007-11-1 09:01
我也安裝的卡巴殺軟的。

應該不是這個問題,問題可能是你 的文件是非ansi的。

作者: leo1984     时间: 2007-11-1 09:22
您寫的卻實有寫出來是正確的,但是不會修改到文本本身
但是我需要修改到文本本身
我剛套用zh159大哥再加您得指令

@echo off
md Temp
for /f "delims=" %%f in ('dir /on/b "*.txt"') do (
echo.>Temp\%%~nf.txt
for /f "tokens=1,2,3,4,5,6,7,8 delims=∥-" %%i in (%%f) do echo %%i∥%%j∥%%k∥%%l∥%%m∥%%o∥%%p∥>>Temp\%%~nf.txt
)
pause

寫成功了
小弟新手總算寫成功一次了^^
感謝您指導我成長
好感動啊
平常都玩一些cgi和php,那些指令看慣再看dos,在不知道的領域裡學起來特別困難啊><
雖然我只是簡單套用,但是大哥熱情幫忙就是幫我學習一大步!

Last edited by leo1984 on 2007-11-1 at 09:27 AM ]

作者: abcd     时间: 2007-11-1 09:31
o(∩_∩)o...,一般我是不會去修改文件,只是讓樓主看到效果而已

修改文件只要導出到文件即可。

作者: terse     时间: 2007-11-1 10:44
刚用4楼、5楼、6楼的3个P测试了一下空格文件名后4楼和5楼都没通过,文件内容有重复格式的话 4楼的也不能以第一排内容命名,
6楼的以上测试全部通过!
这方面似乎SED好用哦!

作者: leo1984     时间: 2007-11-1 11:14
確實啊
剛測試我自己寫的,如果遇上沒有 - 符號的,就會把ip字串給刪除
請問sed "s/\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\) - \1/\1/"
應該如何輸出呢?
似乎不可以加在bat的指令裡@@

作者: abcd     时间: 2007-11-1 11:17
sed "/-/ s/\(\{1,3\}\.\{1,3\}\.\{1,3\}\.\{1,3\}\) - \1/\1/" test.txt>>test1.txt


加个正则就可以只处理带-的行了。

作者: leo1984     时间: 2007-11-1 11:24
老大哥啊
您是知道老弟我處理的是一整個目錄的文本
sed指令看起來既無迴圈也無變數
看起來特別讓小老弟摸不著頭緒

請問如何處理整個目錄的文本並且輸出了
感謝老大哥啊><

作者: abcd     时间: 2007-11-1 11:27
@echo off
md Temp
for %%i in (*.txt) do (
echo.>Temp\%%~ni.txt
sed "/-/ s/\(\{1,3\}\.\{1,3\}\.\{1,3\}\.\{1,3\}\) - \1/\1/" "%%i">>Temp\%%~ni.txt
)
pause


改你的

作者: leo1984     时间: 2007-11-1 11:34
sed果然精準度極高
可以直接指定哪一個字符進行更改
不用像bat要排出陣列來進行更改
兩個結合後可以作出相當於vb軟件程序的效果
看來學會bat之外,另外還要學sed
我的學習之火燃燒起來啦><
感謝老大哥! 這世界有你們才會進步哪

Last edited by leo1984 on 2007-11-1 at 11:35 AM ]

作者: abcd     时间: 2007-11-1 11:47
不只sed命令的,还有很多的,awk或gawk更强大。

许多linux和unix命令真是很好用的。

作者: abcd     时间: 2007-11-1 11:49
这些命令之所以强大的一点是对正则表达式支持的比ms-dos要好。

作者: leo1984     时间: 2007-11-1 12:00
哇~還有awk或gawk兩種更強大?!
那小老弟想學習的話,應該學習哪一些比較正確勒?@@?
還是其實這些指令都是可以互通去瞭解的?