2016-08-16 42 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 

以前我以Regex Quote-Like operatorssln,以提供可读性/可维护性使用sed命令如下

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

嗨,尼克,正如以前指出,你应该在你的问题中使用[标记](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提供。

再加上另一个solutionmob提供一个优雅的引用机制。

加上一些编码,把它放在一起针对特定塞纳里奥:

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)"; 
} 

注:我没有大写的人引用的话。如果您想实现该目标,您需要mapucsplit的部分内容。同样,在被引用的单词是数字和单词混合的情况下,它最终会引用所有的数字和单词。如果这是一个问题,那么可以通过拆分单词,循环遍历每个单词,评估它的内容以查看是否需要引用,然后将结果连接到返回的字符串来更好地服务。

-3

为什么所有这些无聊的事情?

如何:

$线=〜S /(([^(] +))/ “\ 1”/克;

注意,()基团的子表达式;(匹配一个文字'('(不需要删除一个')'); [^(] +在括号内匹配一组非圆括号;“\ 1”引用了什么匹配,即括号内发生了什么,除括号本身外。

+4

你测试了这个吗?这不起作用。另外,perl比''1'更喜欢'$ 1'(避免警告'\ 1更好写成$ 1')。 –

+0

是的,'\ 1'旨在用于正则表达式;您在替换文本中使用'$ 1'。 –

0

这不再是一个简单的替代个别行ution所以它不再是SED工作,这是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的第三个参数匹配()和多焦RS。