sed를 사용하여 특정 문자열 앞의 쉼표를 바꾸는 방법

sed를 사용하여 특정 문자열 앞의 쉼표를 바꾸는 방법

파일이 있습니다 temp.txt. 여기서는 쉼표( ,)를 Between 및 키워드로 바꾸고 싶습니다 .||SelectFrom

select emp_name,
       emp_id,
       loc
from   emp_join ,
       emp_loc
where emp_join.id = emp_loc.id 
and  join_date > to_date('2015-01-01','YYYY-MM-DD')

UNION

select emp_name,
       emp_id,
       loc
from   emp_term,
       emp_loc
where  emp_term.id = emp_loc.id
and   term_date = to_date('2015-01-01','YYYY-MM-DD'); 

나는 sed명령을 사용하고 있습니다

sed 's/,/||/g' temp.txt

그러나 파일의 모든 쉼표를 대체합니다.

이 작업을 수행할 수 있는 간단한 유닉스 명령이 있습니까? 이를 수행하는 방법은 무엇입니까 sed?

답변1

sed -e '/^select/,/^from/s/,/||/' temp.txt

답변2

root@admin:~# cat N | sed 's/\(.\+\)\,\(.\+\)/\1\|\|\2/g'
select emp_name,
       emp_id,
       loc
from   emp_join ,
       emp_loc
where emp_join.id = emp_loc.id 
and  join_date > to_date('2015-01-01'||'YYYY-MM-DD')

UNION

select emp_name,
       emp_id,
       loc
from   emp_term,
       emp_loc
where  emp_term.id = emp_loc.id
and   term_date = to_date('2015-01-01'||'YYYY-MM-DD'); 

답변3

그리고 perl:

perl -0777 -pe 's{\bselect\b.*?\bfrom\b}{$& =~ s/,/||/g}esig' < temp.txt

,각 단어와 그 뒤의 다음 단어 사이는 대소 문자 를 구분하지 않는 로 대체됩니다 (따라서 귀하의 질문에서와 같이 and 를 모두 사용할 수 있지만 , ... 도 사용할 수 있습니다). 이러한 단어 주위에 단어 경계 연산자를 사용하므로 예를 들어에서는 일치하지 않지만 in 또는 or as에서는 일치하지만 일치하지 않습니다.||selectfromfromFromFROMFrOm\bfromfromagefrom,agefrom-age"from",-"단어 문자.

관련 정보