正则表达式删除前缀和另一个大写第一个字母

时间:2009-11-26 15:07:23

标签: regex perl

我需要在这里分两步做事:

  1. 使用[someText]
  2. 修改[xx_someText]的所有匹配项
  3. 使用[SomeText]
  4. 修改[someText]的所有匹配项

    我需要2个正则表达式,因为有些表名不以xx_为前缀。

    我在微软计算机上。

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

    更新

    示例输入:

    CREATE TABLE [dbo]。[xx_attribute](  [attributeID] [int] NOT NULL,  [dateTypeID] [tinyint] NOT NULL,

    应输出为:

    CREATE TABLE [dbo]。[Attribute](  [AttributeID] [int] NOT NULL,  [DateTypeID] [tinyint] NOT NULL

    注意:值[int]和[tinyint]将成为[Int]和[Tinyint],这不是什么大事。

6 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:3)

Perl:

#!/usr/bin/perl
while (<>) {
    s/\[(?:xx_)?([^]]+)\]/\[\u$1\]/g;
    print;
}

当然,您可以从命令行执行此操作:

 perl -pe 's/\[(?:xx_)?([^]]+)\]/\[\u$1\]/g'

这是用你的例子测试的。

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

请注意括号内的所有文字会受到影响。

答案 2 :(得分:0)

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

sed 's/xx_\(\w\+\)/\1/' filename

第二部分:

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

答案 3 :(得分:0)

Awk让这一步变得简单:

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

将您的物品放在一行上。 sub()取消了前缀,然后print语句以大写形式打印第一个剩余字符,其余字符按原样打印。

答案 4 :(得分:0)

这可以使用GNU sed 4.2.1

sed 's/\[xx_/[/g; s/\[./\U&/g'

答案 5 :(得分:0)

仅使用shell

#!/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"