sed 替换每个模式匹配后的第一个匹配项

sed 替换每个模式匹配后的第一个匹配项

我的文件中有这一行:

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}')

相关内容