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

envsm3lx  于 2023-03-04  发布在  其他
关注(0)|答案(2)|浏览(111)

希望有一个通用的实用程序,用于根据命令行参数按需创建regexp模式。
以下脚本仅用于演示拆分和转换的方法。它不是如何使用的最终产品。注意:是的,我确实打算在sed中使用[alphanum],而不是**[alpha]]**。
我的问题是命令的脚本输出(包括在下面)

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
siotufzp

siotufzp1#

这可能对您有用(GNU sed):

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

如果字符是字母或数字,则将其替换为[x],其中x是数字或大小写字母。
备选方案:

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

但是,这会使每个数字加倍(无效果)。

4uqofj5v

4uqofj5v2#

结合每个回复者的输入,我能够制定出我正在寻找的基于**sed的一行程序**命令。

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

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

相关问题