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

ただし、ファイル内のすべてのカンマを置き換えます。

これを行うことができる単純なUnixコマンドはありますか?これを行う方法は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",-"単語文字

関連情報