2016-08-16 3 views
-3

Я хочу заменить слова в круглых скобках для размещения в цитатах. У меня previous question было одно значение в круглых скобках. Это одно и то же, что и мой предыдущий вопрос, но подумал о сценарии, в котором я буду иметь несколько значений в круглых скобках.Заменить слова в круглых скобках для размещения в котировках

Ниже данные я в одной из переменных данных -

SELECT   * 
FROM   ( 
         SELECT table1 file2.txt file.txt queues qdefinitions parameters trap-deposit-dstran.dat.2016-08-07 
         FROM cs_case 
         WHERE ant_cd='FI_BASE_TENANT') t1 
LEFT OUTER JOIN table2 t2 
ON    t2.case_id=t1.case_id 
LEFT OUTER JOIN table3 t3 
ON    t3.service_xid=t1.service_xid 
LEFT OUTER JOIN table4 t4 
ON    t4.service_id=t1.service_id 
WHERE   ( 
           t1.casestatus_cd = (new,retired,pending,OPEN,closed) 
       OR    t1.case_status_num = (1,2,3,4)) 
GROUP BY  t1.case_reference, 
       t2.last_scrfp, 
       t1.service_id 
ORDER BY  t2.last_scrfp DESC 

Вот что я хочу.

SELECT   * 
FROM   ( 
         SELECT table1 file2.txt file.txt queues qdefinitions parameters trap-deposit-dstran.dat.2016-08-07 
         FROM cs_case 
         WHERE ant_cd='FI_BASE_TENANT') t1 
LEFT OUTER JOIN table2 t2 
ON    t2.case_id=t1.case_id 
LEFT OUTER JOIN table3 t3 
ON    t3.service_xid=t1.service_xid 
LEFT OUTER JOIN table4 t4 
ON    t4.service_id=t1.service_id 
WHERE   ( 
           t1.casestatus_cd = ('NEW','RETIRED','PENDING','OPEN','CLOSED') 
       or    t1.case_status_num = (1,2,3,4)) 
GROUP BY  t1.case_reference, 
       t2.last_scrfp, 
       t1.service_id 
ORDER BY  t2.last_scrfp DESC 

Раньше я использовал команду патч в качестве ниже

sed -E 's/\(([^(,$1)'\'']+)\)/('\''\1'\'')/g' Filename.txt 
+2

Привет, Nick, как ранее указывалось, вы должны использовать [разметку] (http://stackoverflow.com/editing-help) в своих вопросах, чтобы сделать все более ясным. В прошлый раз я отформатировал его для вас, но я думаю, вы должны хотя бы узнать, собираетесь ли вы публиковать несколько вопросов. –

+0

Вы должны объяснить, почему этот вопрос отличается от вашего [последнего] (http://stackoverflow.com/q/38955980/176646). Я собирался голосовать как дубликат, пока не увидел комментарий Эд Мортона (http://stackoverflow.com/questions/38955980/extract-words-between-2-parentheses-in-unix-linux#comment65306083_38956931), предлагая вы задаете новый вопрос. – ThisSuitIsBlackNot

+0

Мой предыдущий вопрос имел одно значение в круглых скобках.Эд Мортон прокомментировал команду, где я немного изменился. Это одно и то же, что и мой предыдущий вопрос, но подумал о сценарии, в котором я буду иметь несколько значений в круглых скобках. Я пытаюсь автоматизировать процесс в SAS, где я буду запускать команды unix для замены запроса с помощью команды sed. Надеюсь, что это имеет смысл. – Nick

ответ

0

с использованием solution обеспечивается sln использованием Regex Quote-Like operators, чтобы обеспечить читаемость/ремонтопригодность.

Плюс другой solution предоставленный mob для элегантного механизма цитирования.

Плюс некоторые кодирования, чтобы поставить все это вместе для конкретного Senario:

use strict; 
use warnings 'all'; 

# create a regex quote-like string for our match 
my $rx = qr{\(([^)]+)\)}; 

# step through STDIN 
while(<>) { 

    # Replace matching (...) sections by passing the matched part 
    # to QuoteText() and subsituting the result it returns. 
    # 
    # Note the 'e' and 'g' flags to s///, e enables "extended" 
    # operations which allows us to call QuoteText() and g 
    # replaces _all_ occurances on a line 
    s/$rx/QuoteText($1)/eg; 

    # print out the line (post any possible substitutions) 
    print; 
} 

sub QuoteText { 
    my $text = shift; 

    # the variable we will use to return our result 
    my $result; 

    # Does the text contain commas and also contains alphabetical characters? 
    if($text =~ /,/ && $text =~ /[a-z]/i) { 

     # split up the text around commas, then rejoin them with the 
     # string ',', and then prepend and append a single quote 
     # at the begining and end of line. So one,two becomes 'one','two' 
     $result = q/'/ . join(q/','/, split (',', $text)) . q/'/; 

    # The word _only_ contains numbers, spaces and commas, leave as is 
    } elsif($text =~ /^[\s\d,]+$/i) { 
     $result = $text; 

    # We possibly have just a single word? default to quoting the word 
    } else { 
     $result = qq/'$text'/; 
    } 

    # return our result wrapped in()'s 
    return "($result)"; 
} 

Примечание: Я не в верхнем регистре процитированные слова. Вам нужно будет map и uc частей split, если вы хотите этого достичь. Кроме того, в случае, когда слова, которые должны быть указаны, представляют собой смесь чисел и слов, это приведет к цитированию всех чисел и слов. Если это проблема, тогда это может лучше обслуживать, разбивая слова, перебирая каждое слово, evalutaing его содержимое, чтобы увидеть, нужно ли ему кавычки и затем объединение результата в возвращаемую строку.

-3

ПОЧЕМУ ВСЕ ЭТО ИНСАНСКОЕ ОСЛОЖНЕНИЕ?

Как насчет:

$ строка = ~ s/(([^ (] +))/"\ 1"/г;

Обратите внимание, что() группирует sub-expression; (соответствует литералу '(' (нет необходимости элиминировать ')'); [^ (] + соответствует набору не круглых скобок в объявленных круглых скобках; "\ 1" цитирует, что было а именно, что произошло в круглых скобках, за исключением самих круглых скобок.

+4

Вы проверили это? Это не работает. Кроме того, perl предпочитает '$ 1'' '1' (избегайте предупреждений' \ 1 лучше писать как $ 1'). –

+0

Да, '\ 1' предназначен для использования в регулярном выражении; вы используете '$ 1' в заменяющем тексте. –

0

Это уже не простая подстановка социологическое загрязнение на отдельных линиях, так что это уже не работа для СЭД, это работа для AWK:

$ cat tst.awk 
BEGIN { RS="^$"; ORS="" } 
{ 
    while (match($0,/(=\s*\()([^()]+)(\))/,a)) { 
     if (a[2] ~ /[^0-9,]/) { 
      gsub(/,/,"\047,\047",a[2]) 
      a[2] = "\047" toupper(a[2]) "\047" 
     } 
     print substr($0,1,RSTART-1) a[1] a[2] a[3] 
     $0 = substr($0,RSTART+RLENGTH) 
    } 
    print 
} 

$ awk -f tst.awk file 
SELECT   * 
FROM   (
         SELECT table1 file2.txt file.txt queues qdefinitions parameters 
trap-deposit-dstran.dat.2016-08-07 
         FROM cs_case 
         WHERE ant_cd='FI_BASE_TENANT') t1 
LEFT OUTER JOIN table2 t2 
ON    t2.case_id=t1.case_id 
LEFT OUTER JOIN table3 t3 
ON    t3.service_xid=t1.service_xid 
LEFT OUTER JOIN table4 t4 
ON    t4.service_id=t1.service_id 
WHERE   (
           t1.casestatus_cd = ('NEW','RETIRED','PENDING','OPEN','CLOSED') 
       OR    t1.case_status_num = (1,2,3,4)) 
GROUP BY  t1.case_reference, 
       t2.last_scrfp, 
       t1.service_id 
ORDER BY  t2.last_scrfp DESC 

выше использует GNU AWK для третьего Arg, чтобы соответствовать() и мульти-символьные RS.

Смежные вопросы