藍森林首頁 | 返回主頁 | 本站地圖 | 站內搜索 | 聯繫信箱 |
 您目前的位置:首頁 > 自由軟件 > 技術交流 > 應用編程


    

藍森林 http://www.lslnet.com 2006年6月26日 11:18


請教高手,關於sed的一個問題

[code][root@lfs tmp]# cat aa
#!/bin/sed -f
/^[^ ]/!d
N
s/^\([^ ]*\).*\n.*addr:\([^ ]*\).*/\1 \2/



[root@lfs tmp]# cat bb
#!/bin/sed -f
#/^[^ ]/!d
#N
s/^\([^ ]*\).*\n.*addr:\([^ ]*\).*/\1 \2/



[root@lfs tmp]# ifconfig|sed '/^[^ ]/!d;n'     
eth0      Link encap:Ethernet  HWaddr 00:0F:1F:65:02:70  
          inet addr:202.×××××  Bcast:202.106.185.127  Mask:255.255.255.192
eth1      Link encap:Ethernet  HWaddr 00:0F:1F:65:02:71  
          inet addr:192.168.123.1  Bcast:192.168.123.255  Mask:255.255.255.0
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0


[root@lfs tmp]# ifconfig|sed '/^[^ ]/!d;n'|./aa
eth0 202.××××××
eth1 192.168.123.1
lo 127.0.0.1



[root@lfs tmp]# ifconfig|sed '/^[^ ]/!d;n'|./bb
eth0      Link encap:Ethernet  HWaddr 00:0F:1F:65:02:70  
          inet addr:202.××××××  Bcast:202.106.185.127  Mask:255.255.255.192
eth1      Link encap:Ethernet  HWaddr 00:0F:1F:65:02:71  
          inet addr:192.168.123.1  Bcast:192.168.123.255  Mask:255.255.255.0
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0[root@lfs tmp]# [/code]

為什麼會這樣呢?

請教高手,關於sed的一個問題

:shock:

請教高手,關於sed的一個問題

為什麼不?

請教高手,關於sed的一個問題

腳本aa和bb所不同的就是bb少了下面兩個語句
/^[^ ]/!d
N
但是再把數據傳遞給腳本bb前,我已經用命令
sed '/^[^ ]/!d;n'
處理了一遍數據。
在這兩個腳本中,最後的一個語句
s/^\([^ ]*\).*\n.*addr:\([^ ]*\).*/\1 \2/
所處理的數據是完全一樣的,所以結果也應該一樣啊,但是為什麼不同呢?

請教高手,關於sed的一個問題

n!=N

請教高手,關於sed的一個問題

而且,在sed中只有N;H;G命令會產生\n

請教高手,關於sed的一個問題

請教高手,關於sed的一個問題

n  讀入下一行到模式空間,內部的行指針+1
N  當前模式空間尾部加"\n" ,讀入下一行追加到模式空間尾部

請教高手,關於sed的一個問題

-->
這個我明白了,但是為什麼我把n改成N了,下面的命令還是沒有正確結果呢?
[code]
[root@lfs tmp]# ifconfig|sed '/^[^ ]/!d;N'|./bb
eth0      Link encap:Ethernet  HWaddr 00:0F:1F:65:02:70   
         inet addr:202.106.185.74  Bcast:202.106.185.127  Mask:255.255.255.192
eth1      Link encap:Ethernet  HWaddr 00:0F:1F:65:02:71   
         inet addr:192.168.123.1  Bcast:192.168.123.255  Mask:255.255.255.0
lo        Link encap:Local Loopback   
         inet addr:127.0.0.1  Mask:255.0.0.0[/code]

請教高手,關於sed的一個問題

.........什麼是正確結果?

請教高手,關於sed的一個問題

請教高手,關於sed的一個問題

/^[^ ]/!d
N
s/^\([^ ]*\).*\n.*addr:\([^ ]*\).*/\1 \2/

請教高手,關於sed的一個問題

請看我的兩個腳本
[code][root@lfs tmp]# cat aa
#!/bin/sed -f
/^[^ ]/!d
N
s/^\([^ ]*\).*\n.*addr:\([^ ]*\).*/\1 \2/



[root@lfs tmp]# cat bb
#!/bin/sed -f
#/^[^ ]/!d
#N
s/^\([^ ]*\).*\n.*addr:\([^ ]*\).*/\1 \2/ [/code]


現在的問題是,為什麼這兩個腳本得到的結果不一樣
[code][root@lfs tmp]# ifconfig|./aa
eth0 202.*******
eth1 192.168.123.1
lo 127.0.0.1
[root@lfs tmp]# ifconfig|sed '/^[^ ]/!d;N'|./bb
eth0      Link encap:Ethernet  HWaddr 00:0F:1F:65:02:70  
          inet addr:202.******** Bcast:202.*******   Mask:255.255.255.192
eth1      Link encap:Ethernet  HWaddr 00:0F:1F:65:02:71  
          inet addr:192.168.123.1  Bcast:192.168.123.255  Mask:255.255.255.0
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0[/code]

雖然腳本bb少了兩個命令
/^[^ ]/!d
N
但是把數據傳遞給bb前,我用命令[code]sed '/^[^ ]/!d;N'[/code]把數據處理了,所以應該有相同的結果啊。

請教高手,關於sed的一個問題

難道在腳本中的
[code]/^[^ ]/!d
N [/code]和命令行中的
-->
處理出的數據格式不一樣?

求高手解釋

請教高手,關於sed的一個問題

一個循環vs兩個循環當然不一樣了^_^

這是一個循環完成,執行s///命令時模式空間有兩行內容
[code]/^[^ ]/!d
N
s/^\([^ ]*\).*\n.*addr:\([^ ]*\).*/\1 \2/ [/code]

這是分兩個循環完成,執行s///命令時模式空間只有一行內容
[code]ifconfig|sed '/^[^ ]/!d;N'|./bb [/code]

請教高手,關於sed的一個問題

請教高手,關於sed的一個問題

請教高手,關於sed的一個問題

-->
如果有不同就奇怪了
比如一個文件f,內容是
a1
b2
那麼
sed 'n' f
的過程是
讀入a1 到模式空間,打印出 a1
然後n讀入b2到模式空間,打印出b2

sed 'N' f
讀入a1到模式空間
然後N加\n到a1後面讀入b2然後打印 "a1\nb2"

請比較一下
echo "a1
b2"|sed 'n;='



echo "a1
b2"|sed 'N;='

另建議讀
http://phi.sinica.edu.tw/aspac/reports/96/96005/

請教高手,關於sed的一個問題

我是個新手,請給具體解釋一下下面的意思。先謝謝了!! :roll:  :roll:
#!/bin/sed -f
/^[^ ]/!d
N
s/^\([^ ]*\).*\n.*addr:\([^ ]*\).*/\1 \2/

請教高手,關於sed的一個問題

我一看sed的代碼就頭暈。。。怎麼辦???



Copyright © 1999-2000 LSLNET.COM. All rights reserved. 藍森林網站 版權所有。 E-mail : webmaster@lslnet.com