2008年07月15日

问题:
如下文本

60.208.0.224
60.208.103.192
131.9.124.72
60.208.20.119
60.208.20.9
2.110.213.40
8.56.32.24
60.53.37.128
60.3.98.1

怎么先按ip的第一位sort,然后按第二位sort,然后按第三,第四

结果是这样
2.110.213.40
8.56.32.24
60.3.98.1
60.53.37.128
60.208.0.224
60.208.20.9
60.208.20.119
60.208.103.192
131.9.124.72

解法:
1.

BASH:
  1. sort -t. -k1,1n -k2,2n -k3,3n -k4,4n

2.

BASH:
  1. sed 's/\./ /g' urfile|sort -nt ' ' -k1 -k2 -k3 -k4|sed 's/ /./g'

问题:
httpd.conf文件中含有以下内容,要把Directory块中含有/usr/local/apache/cgi-bin这一块注释掉:

Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all


AllowOverride None
OptionsNone
Orderallow,deny
Allow fromall


Optioin Index
Allow all

解法
1.

BASH:
  1. sed -r '/^(<directory .*cgi-bin.*)/{s/^/#/;:a;n;/^$/!s/^/#/;ta} ' httpd.conf

今天写的最长的一行。

2.

BASH:
  1. sed  '/^</directory></directory><directory .*cgi-bin.*/,/^<\/Directory>/s/^/#/; ' httpd.conf

sed替换大全:

sed 's/foo/bar/' # 替换第一次出现
sed 's/foo/bar/4' # 替换第四次出现
sed 's/foo/bar/g' # 替换所有的出现
sed '1s/foo/bar/' # 替换第一行第一次出现

标签 :

4 楼了已经

  • luguo写于08年07月16日

    第1个的perl解法:
    perl -n -e 'push @foo, $_; END {print sort {pack("C4",split(/\./,$a)) cmp pack("C4",split(/\./,$b))} @foo;}' test.txt

  • dream写于08年07月16日

    1. sed 's/\./ /g' urfile|sort -nt ' ' -k1 -k2 -k3 -k4|sed 's/ /./g',这行为什么不像解1中需要 -k1,1 -k2,2,而只是-k1 -k2, btw, 为什么要,1 ,2 ,3...看了半天manpage 没看懂。

    2. sed -r '/^(<Directory.*cgi-bin.*)/{s/^/#/;:a;n;/^$/!s/^/#/;ta} ' httpd.conf,这行有点太难懂了... orz

    3. 最后一个sed 解释,赞!

  • cocobear写于08年07月17日

    perl的看着好怪啊!

    1,2,3是把每一行的内容分段进行sort;第二种解法把.替换为空格,sort默认是按空格进行分段,所以就不需要指定POS2了。

  • dream写于08年07月17日

    hehe 明白了,谢谢讲解

发表评论

在下面加入你的评论,或者 trackback 从你的博客站点。 订阅本文的评论。

:

:

:

« sed的几个选项
» shell脚本解题3