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개가 있으므로 gsed를 입력하면 모두 대체되고 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() ...)에는 두 번째 괄호 세트가 없습니다 . 그런 다음 a까지 non이 뒤에 오는 모든 항목을 일치시키고 해당 항목만 concat_ws()바꿀 수 있습니다 . 이와 같이:concat_ws((${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}')

관련 정보