代码之家  ›  专栏  ›  技术社区  ›  Eric Marceau

使用sed将单词/字符串转换为字符列表

  •  0
  • Eric Marceau  · 技术社区  · 3 年前

    想要一个基于命令行参数的通用实用程序,用于按需创建regexp模式。

    以下脚本仅用于演示拆分和转换的方法。它并不是如何使用它的最终产品。 注意: 是的,我确实打算使用 [[字母数字]] 在里面 阿尔法 .

    我的问题是命令的脚本(包括在下面)的输出

    scriptname abc
    

    [Aa][BCbc]
    

    当我想要的时候

    [Aa][Bb][Cc]
    

    我正在寻找指导命令的正确sed语法 单独重复每个字符的替换 ,不仅仅是第一个。

    剧本

    #!/bin/bash
    
    makePatternMatch()
    {
        echo "${charList}" | awk 'BEGIN{
            regExp="" ;
        }
        {
            if( $0 != "" ){
                for( i=1 ; i <= NF ; i++ ){
                    regExp=sprintf("%s[%s%s]", regExp, toupper($i), tolower($i) ) ;
                } ;
            } ;
        }END{
            printf("%s\n", regExp ) ;
        }'
    }
    
    explodeString()
    {
        charList=$(echo "${pattern}" | sed 's+[[alphanum]]*+&\ +g' )
    }
    
    
    for pattern in $@
    do
        explodeString
        makePatternMatch
    done
    
    0 回复  |  直到 3 年前
        1
  •  2
  •   potong    3 年前

    这可能适用于您(GNU sed):

    sed -E 's/([[:alpha:]])|[[:digit:]]/[\u\1\l&]/g' file
    

    如果字符是字母或数字,请将其替换为 [x] 其中x是数字或大小写字母。

    可供替代的

    sed 's/[[:alnum:]]/\u&\l&/g' file
    

    然而,这会使每个数字翻倍(没有效果)。

        2
  •  0
  •   Eric Marceau    3 年前

    结合每个回复者的意见,我能够制定 -基于一个衬垫 我正在寻找的命令。即

    for pattern in "ab*c1" "d2e?f"
    do  echo "${pattern}" |
        sed 's/[[:alpha:]]/[\U&\L&]/g'
    done
    

    给我

    [Aa][Bb]*[Cc]1
    [Dd]2[Ee]?[Ff]
    

    但回到我的OP中的脚本,修改后的逻辑是:

    #!/bin/bash
    
    makePatternMatch()
    {
        echo "${charList}" | awk 'BEGIN{
            regExp="" ;
        }
        {
            if( $0 != "" ){
                for( i=1 ; i <= NF ; i++ ){
                    if( $i ~ /[[:alpha:]]/ ){
                        regExp=sprintf("%s[%s%s]", regExp, toupper($i), tolower($i) ) ;
                    }else{
                        regExp=sprintf("%s%s", regExp, $i ) ;
                    } ;
                } ;
            } ;
        }END{
            printf("%s\n", regExp ) ;
        }'
    }
    
    explodeString()
    {
        charList=$(echo "${pattern}" | sed 's+.+&\ +g' )
    }
    
    
    for pattern in "$@"
    do
        explodeString
        makePatternMatch
    done
    

    再次感谢所有提供各种例子和见解的人!