【问题标题】:How to extract words between 2 parentheses in Unix/ Linux?如何在 Unix/Linux 中提取两个括号之间的单词?
【发布时间】:2016-12-21 17:05:06
【问题描述】:

我有一个 SAS 数据集,其中查询列表作为变量之一。下面是变量值之一:

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) OR 
t1.CASE_STATUS_CD = (OPEN) )
AND ( t3.SEARCH_VALUE = (HighVal_Ind) AND t3.SEARCH_VALUE_N <= 3 ) AND 
( t4.SEARCH_VALUE_Nm = (Curr_Strategy) AND t4.SEARCH_STRG = (095) ) 
GROUP BY t1.CASE_REFERENCE,t2.LAST_SCRFP,t1.SERVICE_ID 
ORDER BY t2.LAST_SCRFP DESC

我想要做的是我想把值输入代码在()中作为(' ')

例如:

WHERE ( t1.CASESTATUs_CD = (NEW) OR t1.CASE_STATUS_CD = (OPEN) ) 

我想把它改成:

WHERE ( t1.CASESTATUs_CD = ('NEW') OR t1.CASE_STATUS_CD = ('OPEN') ) 

我该怎么做?

【问题讨论】:

  • 欢迎来到 Stack Overflow。你的问题完全不可读。请阅读markdown help 然后edit 你的问题,使代码看起来像代码。您还应该解释到目前为止您为解决问题所做的尝试,以及失败的原因。
  • edit 你的问题是为了澄清list of queries as one of the variable 的含义。您是说文本块包含在 shell 变量中吗?如果是这样,为什么以及它来自哪里?脚本应如何识别您希望引用的括号内的文本与您不想引用的括号内的文本?

标签: linux perl unix awk sas


【解决方案1】:

您的问题不清楚,但也许这就是您想要的:

$ sed -E 's/\(([^()]+)\)/('\''\1'\'')/g' 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') OR
t1.CASE_STATUS_CD = ('OPEN') )
AND ( t3.SEARCH_VALUE = ('HighVal_Ind') AND t3.SEARCH_VALUE_N <= 3 ) AND
( t4.SEARCH_VALUE_Nm = ('Curr_Strategy') AND t4.SEARCH_STRG = ('095') )
GROUP BY t1.CASE_REFERENCE,t2.LAST_SCRFP,t1.SERVICE_ID
ORDER BY t2.LAST_SCRFP DESC

上面是在这个输入文件上运行的:

$ cat 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) OR
t1.CASE_STATUS_CD = (OPEN) )
AND ( t3.SEARCH_VALUE = (HighVal_Ind) AND t3.SEARCH_VALUE_N <= 3 ) AND
( t4.SEARCH_VALUE_Nm = (Curr_Strategy) AND t4.SEARCH_STRG = (095) )
GROUP BY t1.CASE_REFERENCE,t2.LAST_SCRFP,t1.SERVICE_ID
ORDER BY t2.LAST_SCRFP DESC

【讨论】:

  • 这就是我要找的东西,但是当我运行命令时,它会提供额外的引号 - 之前 - (' Select Table1 and after ANT_CD='FI_BASE_TENANT' '),它也没有引用就我而言,HighVal_Ind。感谢您的帮助。
  • 对于第一个问题,一个可能的解决方案是在第二个括号表达式 ([^()'\'']) 中添加 '\'' - 鉴于您发布的输入,这是不可能的,所以如果您有一些产生该行为的其他输入,那么您需要在您的问题中包含该输入。
  • Ed,非常感谢,这个函数对我有用 -- sed -E 's/(([^(,$1)'\'']+))/('\'' \1'\'')/g' -- 还有一个问题,我保证这将是我的最后一个问题。有什么方法可以将以下条件的值放入字符串中 - WHERE ( t1.CASESTATUs_CD = (NEW, OLD, CLOSED, PENDING) ) 更改为 - WHERE ( t1.CASESTATUs_CD = ('NEW', 'OLD' , '关闭', '待处理') )
  • 当然,但这与您发布的问题完全不同。如果你想解决那个完全不同的问题,那么这将需要一个完全不同类型的解决方案,所以发布一个新问题,这次确保你发布的示例输入真正涵盖了你所有的用例(特别是如果你想要引用的可以跨行分割)。
【解决方案2】:

这最好使用正则表达式来解决。在 SAS 中,这是使用 prxchange 函数完成的。假设您的条件中没有空格,我们检查括号之间是否没有空格。如有其他情况,请调整功能。

data query;
    length want $3000;
    have= 
        "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) OR 
        t1.CASE_STATUS_CD = (OPEN) )
        AND ( t3.SEARCH_VALUE = (HighVal_Ind) AND t3.SEARCH_VALUE_N <= 3 ) AND 
        ( t4.SEARCH_VALUE_Nm = (Curr_Strategy) AND t4.SEARCH_STRG = (095) ) 
        GROUP BY t1.CASE_REFERENCE,t2.LAST_SCRFP,t1.SERVICE_ID 
        ORDER BY t2.LAST_SCRFP DESC";
    want =  prxchange("s/\(([^ ]+)\)/('\1')/", -1, have); 
run;

【讨论】:

    猜你喜欢
    • 2011-09-01
    • 1970-01-01
    • 2013-08-15
    • 2018-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-30
    相关资源
    最近更新 更多