sed正则表达式意思是?

sed -e '/^#/d' -e '/^[ \t]*$/d' -e 's#^[ \t]*##' -e 's#[ \t]*$##'

题主你好,

写在前面: 题主的sed中一共是4个表达式, 我先分别讲每个表达式的作用,最后再讲它们放在一起的效果.

你这总共4个正则表达式,从左到右:

    第1个: /^#/d              作用是: 将以#号开头的行删掉

   

    第2个: /^[ \t]*$/d        作用是: 将只含有空格和或tab的行删掉, 这里用的是"和或"说明如果行只包含空格会被删掉, 如果行只包含tab也会被删掉, 如果行是由空格和tab一起组成的也会被删掉

    第3个: s#^[ \t]*##       作用是: 将开头的空格和或tab删掉,但该行后面的内容会保留

    第4个: s#[ \t]*$##       作用是: 将结尾的空格和或tab删掉,但该行后面的内容会保留

---------------

先说一下: sed是读一行处理一行, 而-e的作用是指定多个作用在被处理行上的命令, 并且后面的命令作用对象是头一个-e命令的处理结果.

举例来说, 假设我有一个文件名叫number,里面只有一行内容为1234,则

sed -e 's#1#3#' -e 's#3#5#'的处理情况为:

    先将第1个-e后面的命令,'s#1#3#'作用在内容1234上, 将1替换为3,得到的结果为: 3234.

    再将第2个-e后面的命令,'s#3#5#'作用在第1个-e命令处理后的结果3234上,将3替换为5,得到的结果为5254.

-----

最后引出题主的那个sed命令:  sed -e '/^#/d' -e '/^[ \t]*$/d' -e 's#^[ \t]*##' -e 's#[ \t]*$##'

题主可以对照着上面我对这4个正则表达式的解释去理解我下面所说的:

   先读取文件流的第一行, 看这行:

        1.是否是以#开头的, 如果是则将这行直接删掉, 因为第1个正则就把行都删了,所以后面那三个命令也就不执行了,然后继续读取下一行, 然后从第1个正则开始处理.

       2.如果读入的行不是以#开头的,则第1个正则就没用了, 再看第2个正则, 如果读取的这一行只包含空格和或tab,则将这行删掉, 即然在第2个正则这读入的行就被删了, 后面的两个正则也就不执行了,然后继续读取下一行, 然后从第1个正则开始处理.

       3.如果读入的行不是以#开头的, 则第1个正则就没什么用了, 也不是只包含空格和或tab,则第2个正则也没用了, 如果行是有内容的,但是以空格和或tab开头,这时第3个正则就起作用了, 将开头所有的空格和或tab都删掉,只保留空格和或tab后面的内容, 第3个正则完事了, 再看第4个正则,第4个正则的作用对象是第3个正则处理后的结果,看看第3个正则处理的结果中末尾是否是以空格和或tab结尾的,如果是则将末尾的空格和或tab删掉,剩下的就是最后输出的内容, 说了这么多总结下来就是"掐头去尾".

        4.如果读入的行,即不是以#开头, 也不是只包含空格和或tab,有内容,但不是以空格和或tab开头,但是以空格或是tab结尾的, 此时会将末尾的空格和或tab都删掉,保留剩下的内容,总尾下来就是: "去尾"

-----------

上面说了这么多, 给个例子, 通过执行后的结果和原始数据对比,自己理解一下吧:

写在最后: 写的比较啰嗦,不知道你有没有耐心看完.

希望对你有帮助, 欢迎追问.

       

温馨提示:答案为网友推荐,仅供参考
相似回答