我的文件中有这一行:
select concat_ws('|',column1,'${hiveconf:RUNDATE}'), '${hiveconf:RUNDATE}' as date Group by concat_ws('|',column,'${hiveconf:RUNDATE}')
我需要替换'${hiveconf:RUNDATE}'
为,string('${hiveconf:RUNDATE}')
但仅当它在concat_ws
.
concat_ws
所以我在同一行中有 2 个,因此如果我g
输入 sed ,它会替换所有的RUNDATE
,如果我删除g
,它只会替换第一个出现的位置。
更改后,我的行应该如下所示:
select concat_ws('|',column1,string('${hiveconf:RUNDATE}')), '${hiveconf:RUNDATE}' as date Group by concat_ws('|',column,string('${hiveconf:RUNDATE}'))
所以到目前为止我收集到的各种模式是:concat_ws('|',column1,coalesce(to_date(timestamp),"") concat_ws('|',columnA,to_date(a.timestamp),'01.01.00.01.01') concat_ws('|',column1,max(to_date(timestamp)),substr(id,1,9)) concat_ws('|',column,timestamp_d,'01.03.02',column2).
需要有时间戳列转换为字符串。输出文件如下所示:
concat_ws('|',column1,coalesce(string(to_date(timestamp)),"") concat_ws('|',columnA,string(to_date(a.timestamp)),'01.01.00.01.01') concat_ws('|',column1,string(max(to_date(timestamp))),substr(id,1,9)) concat_ws('|',column,string(timestamp_d),'01.03.02',column2).
答案1
如果您concat_ws(...)
从不嵌套,也就是说,如果从不存在类似的东西concat_ws(... foo() ...)
,那么在 中永远不会有第二组括号concat_ws()
,那么您可以匹配所有出现的concat_ws(
,后跟非(
直到 a${hiveconf:RUNDATE}
并仅替换它们。像这样:
$ sed "s/\(concat_ws([^)]*\)\('\${hiveconf:RUNDATE}\)/\1string(\2/g" file
select concat_ws('|',column1,string('${hiveconf:RUNDATE}'), '${hiveconf:RUNDATE}' as date Group by concat_ws('|',column,string('${hiveconf:RUNDATE}')