регулярное выражение, чтобы удалить префикс и еще один в верхнем регистре первой буквы - PullRequest
0 голосов
/ 26 ноября 2009

Мне нужно сделать все в 2 этапа:

  1. изменить все вхождения [xx_someText] с помощью [someText]
  2. изменить все вхождения [someText] с помощью [SomeText]

Мне нужно это в 2 регулярных выражениях, потому что в некоторых именах таблиц нет префикса xx_.

Я на машине Microsoft.

У меня есть доступ к Unix, НО я использую утилиту gash bash, в которой, по-видимому, установлены sed и perl, если это проще?

UPDATE

Пример ввода:

CREATE TABLE [dbo]. [Xx_attribute] ( [attributeID] [int] НЕ NULL, [dateTypeID] [tinyint] НЕ НУЛЬ,

должно выводиться как:

CREATE TABLE [dbo]. [Attribute] ( [AttributeID] [int] НЕ NULL, [DateTypeID] [tinyint] НЕ NULL

примечание: значения [int] и [tinyint] будут постепенно превращаться в [Int] и [Tinyint], которые не являются значимыми.

Ответы [ 6 ]

4 голосов
/ 26 ноября 2009
perl -pe "s/\[(xx_)?(\w+)\]/'[' . ($1 ? $2 : ucfirst $2) . ']'/ge"

Здесь используются двойные кавычки, потому что, насколько я понимаю, OP находится в командной строке Windows.

3 голосов
/ 26 ноября 2009

В 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

Обратите внимание, что весь текст в скобках.

0 голосов
/ 26 ноября 2009

используя только оболочку

#!/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"
0 голосов
/ 26 ноября 2009

Это работает с использованием GNU sed 4.2.1

sed 's/\[xx_/[/g; s/\[./\U&/g'
0 голосов
/ 26 ноября 2009

Awk делает это одним шагом:

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

Поместите свои предметы в одну строку. Функция sub () убирает префикс, затем оператор print печатает первый оставшийся символ в верхнем регистре, а остальные как есть.

0 голосов
/ 26 ноября 2009

Для первой части вы можете сделать:

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

Вторая часть:

sed 's/\w\+/\u\0/' filename
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...