![使用 sed 如何替换特定字符串之前的逗号](https://linux22.com/image/108585/%E4%BD%BF%E7%94%A8%20sed%20%E5%A6%82%E4%BD%95%E6%9B%BF%E6%8D%A2%E7%89%B9%E5%AE%9A%E5%AD%97%E7%AC%A6%E4%B8%B2%E4%B9%8B%E5%89%8D%E7%9A%84%E9%80%97%E5%8F%B7.png)
我有一个文件temp.txt
。这里我想用Between和关键字替换逗号 ( ,
) 。||
Select
From
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
将在每个单词和其后的下一个单词之间替换,
为,不区分大小写(因此允许同时使用和,例如在您的问题中,但也允许,...)。我们在这些单词周围使用单词边界运算符,因此它不会匹配 in例如,但它会匹配 in or或as ,并且不是||
select
from
from
From
FROM
FrOm
\b
from
fromage
from,age
from-age
"from"
,
-
"
单词字符。