| 
 
twf_cc 
初级用户
 
  
 
  
 
积分 262 
发帖 50 
注册 2004-7-10 
状态 离线
 | 
『楼 主』:
 stream editor (sed) for dos, win32,*nix
 
使用 LLM 解释/回答一下
  
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, 
 
 
 
 
 
    
 
  
 |   
 | 
  2004-8-2 00:00 | 
  
 | 
 | 
 
Climbing 
铂金会员
 
        网络独行侠
  
 
积分 6962 
发帖 2753 
注册 2003-4-16 来自 河北保定 
状态 离线
 | 
 | 
  2004-8-2 00:00 | 
  
 | 
 | 
 
twf_cc 
初级用户
 
  
 
  
 
积分 262 
发帖 50 
注册 2004-7-10 
状态 离线
 | 
『第 3 楼』:
 
 
使用 LLM 解释/回答一下
  
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 楼』:
 
 
使用 LLM 解释/回答一下
  
由于現在正在 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 楼』:
 
 
使用 LLM 解释/回答一下
  
不错,确实很强大,但有几个问题阻止它被人们接受(包括我):1、版本太多,不同的版本支持不同的参数。2、命令行太复杂,没有一个通俗易懂的说明(尤其是中文说明)。3、太多的转义符号阻止了命令行的可读性,你不知道你会在什么时候掉入符号的陷阱。我看了半天FAQ,还是看不太明白楼上给出的几个例子,这就是这个命令无法应用的明证。 
 
    
 
  
  |  
                  
  
                    偶只喜欢回答那些标题和描述都很清晰的帖子! 
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人! 
 |   
 | 
  2004-8-2 00:00 | 
  
 | 
 | 
 
twf_cc 
初级用户
 
  
 
  
 
积分 262 
发帖 50 
注册 2004-7-10 
状态 离线
 | 
『第 6 楼』:
 
 
使用 LLM 解释/回答一下
  
買本名 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 楼』:
 
 
使用 LLM 解释/回答一下
  
我本来就是不会,我也知道有什么所谓的正则表达式(即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 | 
  
 | 
 | 
 
Climbing 
铂金会员
 
        网络独行侠
  
 
积分 6962 
发帖 2753 
注册 2003-4-16 来自 河北保定 
状态 离线
 | 
『第 8 楼』:
 
 
使用 LLM 解释/回答一下
  
经过无数次的试验,这个命令倒是可以用的:ipconfig | sed -n "s/   IP Address*.*: //p"我大概解释一下意思:-n::表示除了用p指定的内容外,不打印其它内容 
s:表示替换 
"/   IP Address*.*: ":注意引号中的内容,表示查找“以三个空格开头后面跟着IP Address字符串,然后后面跟着*.*(表示任意字符串但包括一个.),再然后跟着一个“: ”(冒号+空格)”这样一行。 
"/":表示将上面查找的内容替换为空,中括号中的内容表示上文的内容。 
"/p":表示将余下的内容打印出来(正好就是IP地址了)。我知道我这样写的命令很不规范,但总比没有任何结果(或者只有错误结果)要好一些。 
 
    
 
  
  |  
                  
  
                    偶只喜欢回答那些标题和描述都很清晰的帖子! 
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人! 
 |   
 | 
  2004-8-2 00:00 | 
  
 | 
 | 
 
twf_cc 
初级用户
 
  
 
  
 
积分 262 
发帖 50 
注册 2004-7-10 
状态 离线
 | 
『第 9 楼』:
 
 
使用 LLM 解释/回答一下
  
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 楼』:
 
 
使用 LLM 解释/回答一下
  
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 楼』:
 
 
使用 LLM 解释/回答一下
  
呵呵,你上面的命令的用法我倒还能看懂。你有一条命令有错误,就是看文件的第一行或者前几行(实际上可以自由发挥):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 | 
  
 | 
 | 
 
twf_cc 
初级用户
 
  
 
  
 
积分 262 
发帖 50 
注册 2004-7-10 
状态 离线
 | 
『第 12 楼』:
 
 
使用 LLM 解释/回答一下
  
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 备注 
   
 
 
 
 
  
     
 
 
    
 
  
 |   
 | 
  2004-8-2 00:00 | 
  
 | 
 | 
 
twf_cc 
初级用户
 
  
 
  
 
积分 262 
发帖 50 
注册 2004-7-10 
状态 离线
 | 
『第 13 楼』:
 
 
使用 LLM 解释/回答一下
  
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 楼』:
 
 
使用 LLM 解释/回答一下
  
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 
 
 
 
 
    
 
  
 |   
 | 
  2004-8-3 00:00 | 
  
 | 
 | 
 
Climbing 
铂金会员
 
        网络独行侠
  
 
积分 6962 
发帖 2753 
注册 2003-4-16 来自 河北保定 
状态 离线
 | 
『第 15 楼』:
 
 
使用 LLM 解释/回答一下
  
前面你讲的基本上是BRE(或者包含部分ERE)的用法,我对正则表达式基本上已经明白是什么意思了,这个不用多解释,正则表达式复杂就复杂在那些元字符及匹配模式上,搞清楚了就很简单(只是比较难以阅读罢了)。前面有一个网友提出一个问题,就是将一个目录下的所有文件名改名去掉第一个字符,这应该可以用sed来实现,不知道楼主可不可以给出一个用sed的解决办法(我已经用lmod解决了)。 
 
    
 
  
  |  
                  
  
                    偶只喜欢回答那些标题和描述都很清晰的帖子! 
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人! 
 |   
 | 
  2004-8-3 00:00 | 
  
 |