![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-08-03 14:10 |
共 48,038 主题排行 / 350,123 发帖 / 今日 0 篇 / 48,251 会员排行 |
| DOS批处理 & 脚本技术(批处理室) » stream editor (sed) for dos, win32,*nix |
| 可打印版本 4,101 / 29 |
| 第1楼 twf_cc | 发表于 2004-08-02 00:00 |
| 初级用户 发帖 50 积分 262 | |
|
stream editor (sed) for dos, win32,*nix http://www.student.northpark.edu/pemente/sed/
sed , very power stream editor for filtering text....input...etc GNU sed 4.07 now ported to MSDOS example for using sed under WinXP cmd.exe @echo off date /t ipconfig | findstr /C:"IP Address" > NUL if errorlevel 1 ( echo 127.0.0.1 ) else ( ipconfig | sed "s/IP Address/!d;s/.*: //" ) example to make a if -else statment /^*****$/ { s/.*/&: \tNumber/ t end } /^*****$/ { s/.*/&: \tLetter/ t end } /^*****$/ { s/.*/&: \tNumber and letter/ t end } /^ *$/ { s/./A blank line/ t end } :end under cygwin bash prompt : ~$ echo "123" | sed -f if-else.sed 123: Number ~$ echo "wer" | sed -f if-else.sed wer: Letter you may check the wed site to find out more information with sed It is a free software, |
|
| 第2楼 Climbing | 发表于 2004-08-02 00:00 |
| 铂金会员 发帖 2,753 积分 6,962 来自 河北保定 | |
|
看得我头好大。
|
|
| 第3楼 twf_cc | 发表于 2004-08-02 00:00 |
| 初级用户 发帖 50 积分 262 | |
|
regluar expression ==> sed , awk ,perl ,python ,tcl/tk, egrep, grep, ruby.... etc
很多program 都用上,學它非常有用 winxp 的 findstr 用的也是 regexp findstr /? 可看到它的簡單介紹 sed 處理文本非常好用 假如我有一文件如是, This is a first line. this is second. this is third. this is forth. this is fivth. 我得把空行只剩一行在每行子之間,在第一行前加一空行, 可寫一個 sed 腳本,如此 /^.\{1,\}/ { i\ (這個是真的空行) t end ) :loop /^$/ { N /^\n$/D t loop } :end 執行 sed -f blank.sed example.txt 出來 This is a first line. this is second this is third. .... higgly recommend |
|
| 第4楼 twf_cc | 发表于 2004-08-02 00:00 |
| 初级用户 发帖 50 积分 262 | |
|
由于現在正在 Linux 下,又再試了一下 sed ,用來過濾和替換子串,這個bash script
用了 xmessage, 要在 X Window 用 #!/bin/bash oLC_ALL=$LC_ALL LC_ALL=C export LC_ALL DATE=$(date +%d) case "$DATE" in 0*) DATE=$(echo "$DATE" | sed 's/.//' ;;*) ;; esac cal |sed "s/\<$DATE\>/*&*/" |xmessage -file "-" unset LC_ALL LC_ALL=$oLC_ALL 再一次 feel the power of sed. DOS ,Win32 一樣有它的用處 |
|
| 第5楼 Climbing | 发表于 2004-08-02 00:00 |
| 铂金会员 发帖 2,753 积分 6,962 来自 河北保定 | |
|
不错,确实很强大,但有几个问题阻止它被人们接受(包括我):1、版本太多,不同的版本支持不同的参数。2、命令行太复杂,没有一个通俗易懂的说明(尤其是中文说明)。3、太多的转义符号阻止了命令行的可读性,你不知道你会在什么时候掉入符号的陷阱。我看了半天FAQ,还是看不太明白楼上给出的几个例子,这就是这个命令无法应用的明证。
|
|
| 第6楼 twf_cc | 发表于 2004-08-02 00:00 |
| 初级用户 发帖 50 积分 262 | |
|
買本名 sed 與 awk 的 書看看,O'Reilly 出版,
中文簡體版由機械工業出版社 出版, 1、版本太多,不同的版本支持不同的参数。 用 POSIX 支援的 sed 版本,任何sed script 用POSIX 寫法一定可行 gnu sed 便可 2、命令行太复杂,没有一个通俗易懂的说明(尤其是中文说明)。 一點不複杂, 你沒看深入吧。 3、太多的转义符号阻止了命令行的可读性,你不知道你会在什么时候掉入符号的陷阱。 转义符号 不多, 你沒看過 perl 吧﹖ 我看了半天FAQ,还是看不太明白楼上给出的几个例子,这就是这个命令无法应用的明证。 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 只能說你不會,不是無法應用,sed 由 1978(?) 出現于 Unix,到今天 是 *nix 標準工具之一,Perl 是 sed, awk, shell ,C 的superset,怎會無用﹖ 先學 regexp (正規表達式) 吧,用 XP 的 findstr 玩玩 如沒 *nix 的 grep |
|
| 第7楼 Climbing | 发表于 2004-08-02 00:00 |
| 铂金会员 发帖 2,753 积分 6,962 来自 河北保定 | |
|
我本来就是不会,我也知道有什么所谓的正则表达式(即sed faq中的RE,但具体却不太明白)。但很难解释的是我在Gnu Sed及Super-Sed下,你所给出的这条命令均无法通过:D:\XYF\System\dos>ipconfig | sed "s/IP Address/!d;s/.*: //"
sed: -e expression #1, char 19: Unknown option to `s'D:\XYF\System\dos>ipconfig | sed "s/IP Address/!d;s/.*://" sed: -e expression #1, char 19: Unknown option to `s'D:\XYF\System\dos>ipconfig | ssed "s/IP Address/!d;s/.*://" ssed: -e expression #1, char 19: Unknown option to `s'D:\XYF\System\dos>sed -V GNU sed version 4.0.9 Copyright (C) 2003 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, to the extent permitted by law.D:\XYF\System\dos>ssed -V super-sed version 3.59 based on GNU sed version 3.02.80Copyright (C) 1999 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, to the extent permitted by law.如果你连这么一个基本的命令不能运行也解释不明白的话,我就无话可说了。 |
|
| 第8楼 Climbing | 发表于 2004-08-02 00:00 |
| 铂金会员 发帖 2,753 积分 6,962 来自 河北保定 | |
|
经过无数次的试验,这个命令倒是可以用的:ipconfig | sed -n "s/ IP Address*.*: //p"我大概解释一下意思:-n::表示除了用p指定的内容外,不打印其它内容
s:表示替换 "/ IP Address*.*: ":注意引号中的内容,表示查找“以三个空格开头后面跟着IP Address字符串,然后后面跟着*.*(表示任意字符串但包括一个.),再然后跟着一个“: ”(冒号+空格)”这样一行。 "/":表示将上面查找的内容替换为空,中括号中的内容表示上文的内容。 "/p":表示将余下的内容打印出来(正好就是IP地址了)。我知道我这样写的命令很不规范,但总比没有任何结果(或者只有错误结果)要好一些。 |
|
| 第9楼 twf_cc | 发表于 2004-08-02 00:00 |
| 初级用户 发帖 50 积分 262 | |
|
sorry for using english cause in gb windowsXp
D:\XYF\System\dos>ipconfig | sed "s/IP Address/!d;s/.*: //" some typo on my post ^^^^^^^^^^^^^^^^^^^^^^^^^ should be ipconfig | sed "/IP Address/!d;s/.*: //" means find the string "IP Address" dont delete and then replace all letter in front of : and a space with nothing , remain string or whatever after : you may test how many dlls in C:\WINDOWS\systen32\ under cmd cd C;\WINDOWS\system32 dir | sed "/dll$/!d" | sed -n "$=" I got 1228 dlls or dir | findstr "dll$" | sed -n "$=" |
|
| 第10楼 twf_cc | 发表于 2004-08-02 00:00 |
| 初级用户 发帖 50 积分 262 | |
|
some common use of sed
Under cmd.exe How many file in current dir dir | sed -n "$=" I want 1 line output to terminal like Unix `head' head -n1 sed "1q" your_file.txt I want to delete email header sed "1,/^$/d" whatever.eml I want to remain email header sed "/^$/,$d" whatever.eml I want the last line dont delete sed "$!d" whatever.txt I want to replace all `girl' string with `boy' in a txt sed "s/\<girl\>/boy/g" your.txt ........... many many use of sed |
|
| 第11楼 Climbing | 发表于 2004-08-02 00:00 |
| 铂金会员 发帖 2,753 积分 6,962 来自 河北保定 | |
|
呵呵,你上面的命令的用法我倒还能看懂。你有一条命令有错误,就是看文件的第一行或者前几行(实际上可以自由发挥):sed -n "1p" somefile.txt # 看第一行sed -n "3,5p" somefile.txt # 看3到5行如果我想看文件最后几行如何写?说来说去,sed faq把问题搞复杂了,其实你摁住一个版本的sed,把它的用法讲明白了,然后再讲一下其它版本的有什么不同就容易理解了,但写faq的人弱智,搞的人头晕为止。我现在不明白的有这么几点:1、正则表达式都有哪些规则。我在网上没有找到文档,sed faq中提供的那个链接失效了,估计用google可以搜索到。2、sed中跟在那些/或者//的命令都有哪些,例如p表示打印,d表示删除,!d表示不删除,g表示global(全局)等。没有一个地方介绍完全,包括sed faq。其实学这东西也不复杂,只要找一个写的比较经典的例子从头讲到尾就可以了。
|
|
| 第12楼 twf_cc | 发表于 2004-08-02 00:00 |
| 初级用户 发帖 50 积分 262 | |
|
q is quit
sed '1q' is equal to sed -n "1p" now I have write some regexp explaination, of course, not really good sed have 25 commands(may be wrong,i didnt check manual) , goto google find it out ---------------------------------------------------------------------------------------- 从 findstr 的 help 看 正规表达式与 sed 的使用 一般表达式的快速参考: . 通配符: 任何字符 * 重复: 以前字符是或类别出现零或零以上次数 ^ 行位置: 行的开始 $ 行位置: 行的终点 字符类别: 任何在字符集中的字符 补字符类别: 任何不在字符集中的字符 范围: 在指定范围内的任何字符 \x Escape: 元字符 x 的文字用法 \<xyz 字位置: 字的开始 xyz\> 字位置: 字的结束 under cmd.exe WinxP . ex: sed "s/./-/" 表示 a-z A-Z 0-9 %$#! etc 替换成 - 如 C:\echo "abcd" | sed "s/./-/" -bcd * ex: sed "s/aa*/b/g" 表示 至少一个a , 或更多的a , * 是前字符a 的零个或更多出现, `g'的meaning 是全体替换 C:\echo "aaaaabbbbccc" | sed "s/aa*/e/" ebbbbccc ^ ex: sed -n "/^a.*/p" 表示 由行的开始是a ,在后面是任何字符打印 C:\ipconfig | sed -n "/^W.*/p" `p' 是sed 打印命令 Windows IP Configuration $ ex: sed "s/Linux$/Windows/" 行的终点字符 `Linux' 替换成 Windows 如有一个名 junk.txt , 内容是 I Like Linux Dos is better then Linux sed "s/Linux$/Windows/g" junk.txt `g'的meaning 是全体替换 I like Windows Dos is better then Windows ex: 任何在字符集中的字符, , C:\> date /t | sed "s/*-*-* //" 仅仅 是 0,1,2,3,4,5,6,7,8,9 任何一个 ex: sed "s/<*>*//" <> 是表达 html tags , 那是除了 `>' 是任何字符, html tags 是 <br> </br> <html>whatever </html> sed "s/<*>*//g" whatever.html > whatever.txt 脱去所有 html tags \x 不知道是不是 \n ==> newline \t ==> tab \r ==> return \v ==> vertical tab ......... \<xyz ex: \<xyz 字符边缘 \<Linux 表示 `L' 字前不会匹配 其他的字符 因为 /Linux/ 可以匹配 muLinux xyz\> 是 \<xyz 对立面 Linux\> `x'之后没有字匹配, 因为 /Linux/ 可以匹配 Linuxer /\<Linux\>/ 只有匹配Linux ipconfig | sed -n "/\<E.*/p" ipconfig | sed -n "/.*n\>/p" ipconfig | sed -n "/\<IP\>/p" findstr 是 Unix 的 `grep' 在WindowsXP的 替代, 使用基本正规表达式, sed 正规表达式比较多 , \{n,m\} ,\(regexp\) 是 findstr 没有的. 但是无法用gb chinese input, 只能 copy and paste 加上我功力有限, so, stop here for my post 备注 |
|
| 第13楼 twf_cc | 发表于 2004-08-03 00:00 |
| 初级用户 发帖 50 积分 262 | |
|
some addon to \x for findstr, already remember
\x 逃脱字符特殊的意义 \$ 只有匹配 $ sed "/^\$.*/!d" 含意行的开始是 $,(字面意义,不是行的终点) !d ==> not delete |
|
| 第14楼 twf_cc | 发表于 2004-08-03 00:00 |
| 初级用户 发帖 50 积分 262 | |
|
and some common regexp
/^$/ ==> 空行 *\.**\.**\.** ==> web site 地址 /<*>*/ ==> html tags .* 零个or 更多的任何字符 ...... few example , regexp 是许多的 programming language 的基本语法,也许 增加许多的伸展, 但方法没有改变, like awk , perl...etc 多了 ? , + 的 方法, learning it is the first step for learning programming language |
|
| 第15楼 Climbing | 发表于 2004-08-03 00:00 |
| 铂金会员 发帖 2,753 积分 6,962 来自 河北保定 | |
|
前面你讲的基本上是BRE(或者包含部分ERE)的用法,我对正则表达式基本上已经明白是什么意思了,这个不用多解释,正则表达式复杂就复杂在那些元字符及匹配模式上,搞清楚了就很简单(只是比较难以阅读罢了)。前面有一个网友提出一个问题,就是将一个目录下的所有文件名改名去掉第一个字符,这应该可以用sed来实现,不知道楼主可不可以给出一个用sed的解决办法(我已经用lmod解决了)。
|
|
| 1 2 下一页 |
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |