【问题标题】:regex to remove prefix and another to uppercase the first letter正则表达式删除前缀和另一个大写第一个字母
【发布时间】:2013-08-04 01:46:07
【问题描述】:

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

  1. 用 [someText] 修改所有出现的 [xx_someText]
  2. 用 [SomeText] 修改所有出现的 [someText]

我需要在 2 个正则表达式中使用它,因为某些表名没有以 xx_ 为前缀。

我在 Microsoft 机器上。

我可以访问 Unix,但我正在使用 GIT bash 实用程序,它似乎已经安装了 sed 和 perl,以防万一?

更新

示例输入:

创建表 [dbo].[xx_attribute]( [attributeID] [int] 非空, [dateTypeID] [tinyint] NOT NULL,

应该输出为:

创建表 [dbo].[属性]( [AttributeID] [int] 非空, [DateTypeID] [tinyint] NOT NULL

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

【问题讨论】:

  • 有趣的是,一个人没有回答一个问题就可以积累超过 3.000 个代表......
  • 提出好的问题与提供答案一样有价值。这当然与我负责教室的经历是一致的,尽管情况有点不同。
  • @Carl:这绝对是真的。当你问了 397 个问题时,其中一些肯定是好问题。
  • 我确实有一个很好的问题徽章:)
  • 您忘记向我们展示您迄今为止的尝试。

标签: regex perl


【解决方案1】:
perl -pe "s/\[(xx_)?(\w+)\]/'[' . ($1 ? $2 : ucfirst $2) . ']'/ge"

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

【讨论】:

  • 感谢您提醒我有关“-p”的信息。我不习惯一个班轮。
  • 好答案,但 xx_ 可能不存在,所以应该是:perl -pe 's/(?:xx_)?(\w+)/ucfirst $1/ge'。还要注意单引号,因为您不希望 shell 插入 $1。
  • 方括号也是匹配的一部分
【解决方案2】:

在 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

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

【讨论】:

  • hmm..没用,它返回:CREATE TABLE [dbo].[xx_SomeAttribute]( [someAttributeID] [int] NOT NULL, [dateTypeID] [tinyint] NOT NULL
  • 我完全按照你写的做了,但是做了一个 perl -ne '' output.sql
  • 哦,那你应该更新你的问题。你想包括方括号吗?
  • 不确定我是否遵循,我的问题包含方括号的输入和输出文本,例如[SomeText] 在 #2 谢谢!
  • 你试过用 1 班轮吗?嗯...我在 win7 中无法使用 GIT bash。
【解决方案3】:

Awk 让这一步变得简单:

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

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

【讨论】:

    【解决方案4】:

    只使用外壳

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

    【讨论】:

    • 是的,所以?如果 OP 有它,那么它的罚款。如果没有,还有其他解决方案。
    • 是的,所以? 有点花言巧语,因为 (1) 你从来没有提到你的答案需要一个非常具体的 Bash 版本和 (2) 绝大多数系统还没有该版本可用。
    • 奇怪,我们中的很多人从未提及 Perl、Python、sed 或其他任何软件版本,直到以后可能。那么这里真正的问题是什么?你们中的一些人可能如此迂腐。 WTH
    【解决方案5】:

    对于第一部分你可以做:

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

    第二部分:

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

    【讨论】:

      【解决方案6】:

      这适用于 GNU sed 4.2.1

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

      【讨论】:

      • 大声笑,将事情转换为:[ b e a l l s p a c e d o u t ]
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多