如何替换文件中特定字符串上的字符?

时间:2015-09-24 13:52:26

标签: regex perl awk sed notepad++

我必须为' _ '替换字符'',但仅限于文件的特定区域(函数名称),我有一个像这样:

.destroy()

我正在考虑使用notepad ++或sed,并且只替换捕获的组,例如第一行是:

\name{function.name.something} \usage{function.name.something(parameter.something, parameter2.something)} 并替换为\\name\{(.+)\}

第1组 \ 1 )将下划线替换为下划线

感谢您的帮助,谢谢

2 个答案:

答案 0 :(得分:1)

使用gnu-awk

awk -v FPAT='\\\\name{[^}]+}|\\S+' '{gsub(/\./, "_", $1)} 1' file
\name{function_name_something}

\usage{function.name.something(parameter.something, parameter2.something)}

FPAT='\\\\name{[^}]+}|\\S+'将使用给定的正则表达式解析每个字段,这是\name{...}或一些非空格字符串(默认的awk字段)。

更多测试:

cat file
\name{function.name.something} abc.foo.bar    
\usage{function.name.something(parameter.something, parameter2.something)}

awk -v FPAT='\\\\name{[^}]+}|\\S+' '{gsub(/\./, "_", $1)} 1' f
\name{function_name_something} abc.foo.bar    
\usage{function_name_something(parameter_something, parameter2.something)}

答案 1 :(得分:1)

Perl解决方案:

< file.txt perl -pe '
                    ($n, $f) = /(\\name|\\usage)\{(.*?[}(])/
                    and s/\Q$n\E\{\Q$f\E/"$n\{" . ($f=~s=\.=_=gr)/e'

需要Perl 5.14+,否则你必须写

($n, $f) = /(\\name|\\usage)\{(.*?[}(])/
and s/\Q$n\E\{\Q$f\E/"$n\{" . do { ($ff = $f) =~ s=\.=_=g; $ff }/e