V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
gangkui2008
V2EX  ›  问与答

ksh中如何用sed替换多个特殊字符(如[].等)?

  •  
  •   gangkui2008 · Dec 21, 2011 · 12228 views
    This topic created in 5244 days ago, the information mentioned may be changed or developed.
    语句中存在[].*+等特殊字符,想把这些特殊字符全部替换为“\原字符”(木有引号),sed语句该怎么写?
    我想到的笨一点的办法是用多个管道,比如echo []. | sed 's#\[#\\&#g' | sed 's#\]#\\&#g' | sed 's#\.#\\&#g'是可以成功的,但我更想知道如何在一条sed语句中匹配多个特殊字符(可能会用|或[]吧)
    另外请特别注意我用的是ksh(AIX的缺省shell),sed在ksh和bash中的使用方法略有不同,比如echo []. |sed -e 's/\[\|\]\|\./zzz/g'在bash中的结果是zzzzzzzzz,但在ksh中结果是[].,即sed没有匹配到任何一个字符。

    另外还有一个问题是用grep检索文件时,如果给出的关键词含有特殊字符时(当然希望grep不要把它当做特殊字符处理),比较好的处理办法是什么,除了用sed匹配后在字符前加\?



    >uname -v
    6
    [root@bruce3]/wideopen/stone
    >oslevel -r
    6100-01
    [root@bruce3]/wideopen/stone
    >echo $0
    -ksh
    12 replies    1970-01-01 08:00:00 +08:00
    gangkui2008
        1
    gangkui2008  
    OP
       Dec 21, 2011
    >echo []. | sed 's#\[\|\]\|\.#zzz#g'
    [].
    [root@bruce3]/wideopen/stone
    >echo []. | sed 's#[\[\]\.]#zzz#g'
    [].
    gastlygem
        2
    gastlygem  
       Dec 21, 2011
    是这个意思吗?俺是cygwin下的ksh加上gnu sed,没你的环境,不知道灵不灵:

    >echo []. | sed -r 's!(\[|\]|\.)!\\\1!g'
    \[\]\.
    gangkui2008
        3
    gangkui2008  
    OP
       Dec 21, 2011
    @gastlygem 还是不行,

    >echo []. | sed -r 's!(\[|\]|\.)!\\\1!g'
    sed: Not a recognized flag: r
    Usage: sed [-n] Script [File ...]
    sed [-n] [-e Script] ... [-f Script_file] ... [File ...]
    [root@bruce3]/wideopen/stone
    >echo []. | sed 's!(\[|\]|\.)!\\\1!g'
    sed: 0602-404 Function s!(\[|\]|\.)!\\\1!g cannot be parsed.
    [root@bruce3]/wideopen/stone
    >echo []. | sed 's/(\[|\]|\.)/\\&/g'
    [].
    [root@bruce3]/wideopen/stone
    >echo []. | sed 's/(\[|\]|\.)/zzz/g'
    [].
    ratazzi
        4
    ratazzi  
       Dec 21, 2011
    @gangkui2008
    echo []. | sed 's!\(\[\|\]\|\.\)!\\\1!g'
    | 也需要转义

    @gastlygem
    AIX 应该是类似 BSD 的 sed 没有 GNU sed -r 的扩展正则
    gastlygem
        5
    gastlygem  
       Dec 21, 2011
    果然 AIX 带的不是 gnu sed,不支持 -r。你还是使用多个管道符吧,又好读又好看 :D
    gangkui2008
        6
    gangkui2008  
    OP
       Dec 21, 2011
    @ratazzi
    还是不行
    >echo []. | sed 's!\(\[\|\]\|\.\)!\\\1!g'
    [].
    ratazzi
        7
    ratazzi  
       Dec 21, 2011
    @gangkui2008
    抱歉手里没有环境,也没办法了
    gangkui2008
        8
    gangkui2008  
    OP
       Dec 21, 2011
    @ratazzi
    thx all the same
    ratazzi
        9
    ratazzi  
       Dec 21, 2011
    @gangkui2008
    echo []. | sed 's/\[/\\\[/g;s/\]/\\\]/g;s/\./\\\./g'
    这种写法应该适用与大多数 UNIX,避免多个管道
    gangkui2008
        10
    gangkui2008  
    OP
       Dec 21, 2011
    @ratazzi
    good, thx
    dreamersdw
        11
    dreamersdw  
       Dec 21, 2011
    使用 fgrep (或者 grep -F)搜索时,不会转义 pattern 中的字符。
    gangkui2008
        12
    gangkui2008  
    OP
       Dec 21, 2011
    @dreamersdw
    cool! 万分感谢
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5633 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 42ms · UTC 06:12 · PVG 14:12 · LAX 23:12 · JFK 02:12
    ♥ Do have faith in what you're doing.