Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
regex删除前缀,另一个删除第一个字母的大写字母_Regex_Perl - Fatal编程技术网

regex删除前缀,另一个删除第一个字母的大写字母

regex删除前缀,另一个删除第一个字母的大写字母,regex,perl,Regex,Perl,我需要在这里分两步做: 用[someText]修改[xx_someText]的所有出现处 使用[someText]修改所有出现的[someText] 我需要在2个正则表达式中使用它,因为有些表名的前缀不是xx\ux 我在一台微软的机器上 我可以访问Unix,但我使用的是GIT bash实用程序,它似乎安装了sed和perl,以防更简单 更新 样本输入: 创建表[dbo]。[xx_属性]( [attributeID][int]不为空, [dateTypeID][tinyint]不为空 应输出为:

我需要在这里分两步做:

  • 用[someText]修改[xx_someText]的所有出现处
  • 使用[someText]修改所有出现的[someText]
  • 我需要在2个正则表达式中使用它,因为有些表名的前缀不是
    xx\ux

    我在一台微软的机器上

    我可以访问Unix,但我使用的是GIT bash实用程序,它似乎安装了sed和perl,以防更简单

    更新

    样本输入:

    创建表[dbo]。[xx_属性]( [attributeID][int]不为空, [dateTypeID][tinyint]不为空

    应输出为:

    创建表[dbo]。[属性]( [AttributeID][int]不为空, [DateTypeID][tinyint]不为空


    注意:值[int]和[tinyint]将变为[int]和[tinyint],这没什么大不了的。

    对于第一部分,您可以做:

    sed 's/xx_\(\w\+\)/\1/' filename
    
    第二部分:

    sed 's/\w\+/\u\0/' filename
    

    Awk将此作为一个步骤:

    awk '{sub("^xx_", ""); print toupper(substr($0, 1, 1)) substr($0, 2);}'
    

    将项目放在一行上。sub()去掉前缀,然后print语句以大写形式打印剩余的第一个字符,其余字符保持原样。

    此操作使用GNU sed 4.2.1

    sed 's/\[xx_/[/g; s/\[./\U&/g'
    
    仅使用外壳

    #!/bin/bash
    declare -a arr
    while read -r -a arr
    do
        for((i=0;i<=${#arr};i++))                    
        do
            case "${arr[i]}" in
                *"[xx_"* );;&
                *"["*)
                    arr[i]=${arr[i]//xx_/}
                    arr[i]=${arr[i]^^${arr[i]:1:1}}
            esac
        done
        echo ${arr[@]}
    done < "file"
    
    !/bin/bash
    声明-arr
    读时-r-a arr
    做
    对于Perl中的((i=0;i):

    #!/usr/bin/perl
    while (<>) {
        s/\[(?:xx_)?([^]]+)\]/\[\u$1\]/g;
        print;
    }
    
    这已通过您的示例进行了测试

    CREATE TABLE [dbo].[xx_SomeAttribute]( [someAttributeID] [int] NOT NULL, [dateTypeID] [tinyint] NOT NULL
    CREATE TABLE [Dbo].[SomeAttribute]( [SomeAttributeID] [Int] NOT NULL, [DateTypeID] [Tinyint] NOT NULL
    
    请注意,括号内的所有文本都会受到影响

    perl -pe "s/\[(xx_)?(\w+)\]/'[' . ($1 ? $2 : ucfirst $2) . ']'/ge"
    

    这里使用双引号是因为我的理解是OP在Windows命令行上。

    有趣的是,一个人可以在没有回答一个问题的情况下积累超过3000名代表…提出好的问题和提供答案一样有价值。这当然与我负责课堂的经验一致,尽管situa卡尔:这肯定是真的。当你问了397个问题时,其中一些肯定是好问题。我确实有一个好问题徽章:)你忘了给我们展示你迄今为止所做的尝试。哈哈,这把问题转化为:[b e a l s p a c e d o o u t]嗯..不起作用,它返回:创建表[dbo]。[xx_SomeAttribute]([someAttributeID][int]NOT NULL,[dateTypeID][tinyint]NOT NULL我完全按照你写的做了,但是做了一个perl-ne'output.sqlOh,那么你应该更新你的问题。你想包括方括号吗?我不太明白,我的问题的输入和输出文本都有方括号,例如[SomeText]在#2中,谢谢!您使用1行程序进行了尝试吗?嗯…我的在win7中使用GIT bash不起作用。谢谢您提醒我关于'-p'。我不习惯使用一行程序。回答很好,但是xx可能不存在,所以应该是:perl-pe's/(?:xx#)?(\w+)/ucfirst$1/ge'。还请注意单引号,因为您不希望shell插入$1。方括号是match alsoyes的一部分,所以?如果OP有,那么它很好。如果没有,还有其他解决方案。是的,所以?有点油嘴滑舌,因为(1)您从未提到您的答案需要非常具体的Bash版本;(2)绝大多数系统都还没有这个版本。奇怪的是,我们中的很多人直到后来才提到Perl、Python、sed或任何软件版本。那么,这里真正的问题是什么呢?你们中的一些人可能很迂腐。WTH
    perl -pe "s/\[(xx_)?(\w+)\]/'[' . ($1 ? $2 : ucfirst $2) . ']'/ge"