![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-08-03 15:17 |
共 48,038 主题排行 / 350,123 发帖 / 今日 0 篇 / 48,251 会员排行 |
| DOS批处理 & 脚本技术(批处理室) » stream editor (sed) for dos, win32,*nix |
| 可打印版本 4,105 / 29 |
| 第16楼 twf_cc | 发表于 2004-08-03 00:00 |
| 初级用户 发帖 50 积分 262 | |
|
我不會寫 batch ,給你一個用 bash script 的方法 , 2.0X above
可用 cygwin 執行, Not test, 1) use sed #!/bin/bash for oldname in * ; do newname=$(echo $i | sed '/.//' ![]() mv $oldname $newname done 2) no sed , using bash #!/bin/bash for oldname in * ; do newname=${oldname:1} mv $oldname $newname done 3) give argument on command line , using cut, usage: $0 *.txt #!/bin/bash file=$1 while ; do newname=$(echo $file |cut -b2- ) mv $file $newname shift done |
|
| 第17楼 twf_cc | 发表于 2004-08-03 00:00 |
| 初级用户 发帖 50 积分 262 | |
|
typo ,
for oldname in * ; do newname=$(echo $i | sed '/.//' ![]() mv $oldname $newname done should be for oldname in * ; do newname=$(echo $i | sed 's/.//' ![]() mv $oldname $newname done |
|
| 第18楼 twf_cc | 发表于 2004-08-03 00:00 |
| 初级用户 发帖 50 积分 262 | |
|
many many typo
for oldname in * ; do newname=$(echo $i | sed 's/.//' ![]() mv $oldname $newname done should be for oldname in * ; do newname=$(echo $oldname | sed 's/.//' ![]() mv $oldname $newname done |
|
| 第19楼 Climbing | 发表于 2004-08-03 00:00 |
| 铂金会员 发帖 2,753 积分 6,962 来自 河北保定 | |
|
我们现在不是在讨论使用Unix来解决问题,我只是在讨论使用sed来解决这个问题,我给出你条件,你不用关心如何使用batch来实现。
命题如下: 1、假设当前目录有一个文件名为 Aneed.ren,当然,在实际情况中会有很多文件。 2、使用dir /b命令,该命令会输出:Aneed.ren。 3、要求使用dir /b | sed "???" 命令输出这样一串字符串:ren "Aneed.ren" "need.ren" 我已经试了一天了,就是找不到怎么把两个字符串连接起来的命令。 我用:dir /b | sed "s/^/ren \"/g;s/$/\"/g" 输出:ren "Aneed.ren" 我用:dir /b | sed "s/^./\"/g;s/$/\"/g" 输出:"need.ren" 但我怎么将两个命令的输出结果连成一行呢?最理想的时候我使用命令: dir /b | sed -n "s/^/ren \"/g;s/$/\"/gp;s/ren \"./\"/gp" 输出: ren "Aneed.ren" "need.ren" 注意,输出结果变为了两行,我知道变成两行的原因就出在第一个p上,p打印时应该是带换行符的,我怎么做才能在一个命令中将两个输出变为一行呢?请指教! [ Last edited by willsort on 2005-10-14 at 16:06 ] |
|
| 第20楼 Climbing | 发表于 2004-08-03 00:00 |
| 铂金会员 发帖 2,753 积分 6,962 来自 河北保定 | |
|
连蒙带骗再晕着,我终于使用sed实现了上述要求,但还是需要一个sed的script文件来配合,这个script文件我命名为ren.sed,内容如下:然后最终用到的命令行是:dir /b | sed -n "s/^/ren \"/g;s/$/\"/gp;s/ren \"./\"/gp" | sed -f ren.sed进一步改善,为了防止文件基本名只有一个字符的文件被改名,进一步修改ren.sed如下:
DOS下的命令行又变为:dir /b | sed -n "s/^/ren \"/g;s/$/\"/gp;s/ren \"./\"/gp" | sed -n -f ren.sed |
|
| 第21楼 Climbing | 发表于 2004-08-03 00:00 |
| 铂金会员 发帖 2,753 积分 6,962 来自 河北保定 | |
|
要最终完成前面所要求的将一个目录下所有文件改名时去掉第一个字符的命令应该是:
dir /b | sed -n "s/^/ren \"/g;s/$/\"/gp;s/ren \"./\"/gp" | sed -n -f ren.sed > %tmp%\temp.bat call %tmp%\temp.bat del %tmp%\temp.bat这个命令不知道要比用lmod复杂多少倍,所以说在DOS下做什么跟你所选用的工具有很大的关系,我不是说sed不好,但至少在这个特定的要求下它要比lmod差远了,当然,可能高手有更高明的实现办法,我拭目以待。在这里感谢twf_cc朋友的不断鼓励和耐心解释,他鼓励我彻底的学习了一下正则表达式在搜索和替换中的应用。 |
|
| 第22楼 twf_cc | 发表于 2004-08-03 00:00 |
| 初级用户 发帖 50 积分 262 | |
|
dir /b | sed -n "s/^/ren \"/g;s/$/\"/gp;s/ren \"./\"/gp"
sorry ,I cannot understand this I ran this command the sed complain dir /b | sed "s/.//" ===> geen.ren but I dont know how to combine it to rename in batch ok ,strip newline in a text with sed say a file contain some content like this a b c d I want to make it `abcd' I would like to use sed -e ":a" -e "N;s/\n//;ta" file I run this on cygwin and cmd.exe no problem, it is a lebel :a to a sed command N ,Next line , replace \n ==> newline ; go back to command until newline disapper. It is a loop sed got some pattern space , hold space,but I cant explain clear with english or chinese I learn it base on a book sed & awk 2 years ago, the book show it with picture , I got a long time to understand it , some command like x ,I never use using sed in cmd.exe to I am not very expericenced,sorry may be dir /b | sed -n "s/^/ren \"/g;s/$/\"/gp;s/ren \"./\"/gp" | sed -e ":a" -e "N;s/\n//;ta" just guess usually I run Cygwin with all XP command if batch can make something like bash put the command result to the varilable , set something = " we run the command in here and the result is for something" using for loop , I know batch have for %%i in (*.txt) do set something = " we run the command in here and the result is for something" set something = ``dir /b | sed "s/.//" '' ren %i %something that is the easy way I think |
|
| 第23楼 twf_cc | 发表于 2004-08-03 00:00 |
| 初级用户 发帖 50 积分 262 | |
|
every tools got their use, sed is very power with scripting , of course,
it may not be use in everywere , It just a tool for us to solve problem . some PS for my bash script It may change 刚才测试一下我随意写的 bash 脚本, 1,2 没有问题,运行後脚本本身亦改了名 ,3 出现问题, while loop 改副档较好,所以 重新post , 哈哈,都是 not test 问题, so 改 #!/bin/bash #usage :$0 file(s) for oldname in $@ do newname=$(echo $oldname | cut -b2-) mv $oldname $newname done |
|
| 第24楼 wchong | 发表于 2004-08-04 00:00 |
| 银牌会员 发帖 510 积分 1,186 | |
|
SORRY!我不太懂。
|
|
| 第25楼 Climbing | 发表于 2004-08-04 00:00 |
| 铂金会员 发帖 2,753 积分 6,962 来自 河北保定 | |
|
这位twf_cc大侠的英文实在太好,所以很多时候都是中英文混合表达思想,英文比中文表达的还要明白,这还是为了照顾我们初学者,否则就是全英文啦。pf!当然,这位朋友肯定是Unix高手,不知道为什么浪迹到了DOS论坛。
|
|
| 第26楼 lxmxn | 发表于 2006-10-26 11:57 |
| 版主 发帖 4,938 积分 11,386 | |
|
太强了。 特意把这个帖子顶起来,让大家学习一下sed命令的使用语法。 |
|
| 第27楼 electronixtar | 发表于 2006-10-26 21:08 |
| 铂金会员 发帖 2,672 积分 7,493 | |
|
看完了两页天书的路过
|
|
| 第28楼 9527 | 发表于 2006-10-26 22:14 |
| 银牌会员 发帖 438 积分 1,185 来自 北京 | |
|
我从来就是路过,根本就没有仔细看,因为没有时间,做个记号在说吧...留着以后在看
|
|
| 第29楼 ceii | 发表于 2007-03-03 10:39 |
| 初级用户 发帖 45 积分 115 | |
|
我觉得19楼的问题本来可以很简单的,为什么搞得那么复杂?
dir /b | sed -r "s/.(.*)/ren & \1/" |
|
| 第30楼 vkill | 发表于 2007-03-03 11:45 |
| 金牌会员 发帖 1,744 积分 4,103 来自 甘肃.临泽 | |
|
英语太好了
|
|
| 上一页 1 2 |
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |