中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » stream editor (sed) for dos, win32,*nix
« [1] [2] »
作者:
标题: stream editor (sed) for dos, win32,*nix 上一主题 | 下一主题
twf_cc
初级用户




积分 262
发帖 50
注册 2004-7-10
状态 离线
『楼 主』:  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



/^[^A-Za-z \t\n]*[0-9]*[^a-zA-Z \t\n]*[0-9]*[^A-Za-z \t\n]*$/ {

s/.*/&: \tNumber/

t end

}

/^[^0-9 \t\n]*[A-Za-z]*[^0-9 \t\n]*[A-Za-z]*[^0-9 \t\n]*$/ {

s/.*/&: \tLetter/

t end

}

/^[^ \t\n]*[0-9A-Za-z]*[^ \t\n]*[0-9A-Za-z]*[^ \t\n]*$/ {

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,





2004-8-2 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Climbing
铂金会员

网络独行侠


积分 6962
发帖 2753
注册 2003-4-16
来自 河北保定
状态 离线
『第 2 楼』:  

看得我头好大。



偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
2004-8-2 00:00
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (653668)  编辑帖子  回复  引用回复
twf_cc
初级用户




积分 262
发帖 50
注册 2004-7-10
状态 离线
『第 3 楼』:  

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


2004-8-2 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
twf_cc
初级用户




积分 262
发帖 50
注册 2004-7-10
状态 离线
『第 4 楼』:  

由于現在正在 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  一樣有它的用處


2004-8-2 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Climbing
铂金会员

网络独行侠


积分 6962
发帖 2753
注册 2003-4-16
来自 河北保定
状态 离线
『第 5 楼』:  

不错,确实很强大,但有几个问题阻止它被人们接受(包括我):1、版本太多,不同的版本支持不同的参数。2、命令行太复杂,没有一个通俗易懂的说明(尤其是中文说明)。3、太多的转义符号阻止了命令行的可读性,你不知道你会在什么时候掉入符号的陷阱。我看了半天FAQ,还是看不太明白楼上给出的几个例子,这就是这个命令无法应用的明证。



偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
2004-8-2 00:00
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (653668)  编辑帖子  回复  引用回复
twf_cc
初级用户




积分 262
发帖 50
注册 2004-7-10
状态 离线
『第 6 楼』:  

買本名 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







2004-8-2 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Climbing
铂金会员

网络独行侠


积分 6962
发帖 2753
注册 2003-4-16
来自 河北保定
状态 离线
『第 7 楼』:  

我本来就是不会,我也知道有什么所谓的正则表达式(即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.如果你连这么一个基本的命令不能运行也解释不明白的话,我就无话可说了。



偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
2004-8-2 00:00
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (653668)  编辑帖子  回复  引用回复
Climbing
铂金会员

网络独行侠


积分 6962
发帖 2753
注册 2003-4-16
来自 河北保定
状态 离线
『第 8 楼』:  

经过无数次的试验,这个命令倒是可以用的:ipconfig | sed -n "s/   IP Address*.*: //p"我大概解释一下意思:-n::表示除了用p指定的内容外,不打印其它内容
s:表示替换
"/   IP Address*.*: ":注意引号中的内容,表示查找“以三个空格开头后面跟着IP Address字符串,然后后面跟着*.*(表示任意字符串但包括一个.),再然后跟着一个“: ”(冒号+空格)”这样一行。
"[s/...]/":表示将上面查找的内容替换为空,中括号中的内容表示上文的内容。
"[s/.../]/p":表示将余下的内容打印出来(正好就是IP地址了)。我知道我这样写的命令很不规范,但总比没有任何结果(或者只有错误结果)要好一些。



偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
2004-8-2 00:00
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (653668)  编辑帖子  回复  引用回复
twf_cc
初级用户




积分 262
发帖 50
注册 2004-7-10
状态 离线
『第 9 楼』:  

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 "$="



2004-8-2 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
twf_cc
初级用户




积分 262
发帖 50
注册 2004-7-10
状态 离线
『第 10 楼』:  

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



2004-8-2 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Climbing
铂金会员

网络独行侠


积分 6962
发帖 2753
注册 2003-4-16
来自 河北保定
状态 离线
『第 11 楼』:  

呵呵,你上面的命令的用法我倒还能看懂。你有一条命令有错误,就是看文件的第一行或者前几行(实际上可以自由发挥):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。其实学这东西也不复杂,只要找一个写的比较经典的例子从头讲到尾就可以了。



偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
2004-8-2 00:00
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (653668)  编辑帖子  回复  引用回复
twf_cc
初级用户




积分 262
发帖 50
注册 2004-7-10
状态 离线
『第 12 楼』:  

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 的使用
一般表达式的快速参考:
  .        通配符: 任何字符
  *        重复: 以前字符是或类别出现零或零以上次数
  ^        行位置: 行的开始
  $        行位置: 行的终点
  [class]  字符类别: 任何在字符集中的字符
  [^class] 补字符类别: 任何不在字符集中的字符
  [x-y]    范围: 在指定范围内的任何字符
  \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
[class] ex:
任何在字符集中的字符, [a-z] [A-Z] [0-9] [a-zA-Z0-9] ,
C:\> date /t | sed "s/[0-9][0-9]*-[0-9][0-9]*-[0-9][0-9]* //"
[0-9]  仅仅 是 0,1,2,3,4,5,6,7,8,9 任何一个
[^class] 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 备注
  





   


2004-8-2 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
twf_cc
初级用户




积分 262
发帖 50
注册 2004-7-10
状态 离线
『第 13 楼』:  

some addon to \x for findstr, already remember
\x  逃脱字符特殊的意义
\$ 只有匹配 $
sed "/^\$.*/!d" 含意行的开始是 $,(字面意义,不是行的终点) !d ==> not delete






2004-8-3 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
twf_cc
初级用户




积分 262
发帖 50
注册 2004-7-10
状态 离线
『第 14 楼』:  

and some common regexp
/^$/ ==> 空行
[a-zA-Z]*\.*[A-Za-z]*\.*[a-zA-Z]*\.*[A-Za-z]* ==> web site 地址
/<[^>][^>]*>*/ ==> html tags
.* 零个or 更多的任何字符
......

few example , regexp 是许多的 programming language 的基本语法,也许
增加许多的伸展, 但方法没有改变, like awk , perl...etc
多了 ? , + 的 方法, learning it is the first step for learning programming language




2004-8-3 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Climbing
铂金会员

网络独行侠


积分 6962
发帖 2753
注册 2003-4-16
来自 河北保定
状态 离线
『第 15 楼』:  

前面你讲的基本上是BRE(或者包含部分ERE)的用法,我对正则表达式基本上已经明白是什么意思了,这个不用多解释,正则表达式复杂就复杂在那些元字符及匹配模式上,搞清楚了就很简单(只是比较难以阅读罢了)。前面有一个网友提出一个问题,就是将一个目录下的所有文件名改名去掉第一个字符,这应该可以用sed来实现,不知道楼主可不可以给出一个用sed的解决办法(我已经用lmod解决了)。



偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
2004-8-3 00:00
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (653668)  编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: