我有一个文件,我必须replace所有的单词,如$ xyz,对于他们我必须这样的replace:
$xyz with ${xyz}. $abc_xbs with ${abc_xbc} $ab,$cd with ${ab},${cd}
这个文件也有一些像$ {abcd}这样的词,我不需要改变。 我正在使用这个命令
sed -i's? $([A-Z _] +)? $ { 1}?g'文件
它在命令行工作正常,但不是在Perl脚本内
覆盖两个后记文件(命令行方式)?
在linux系统上学习x64
关于外部库的编译程序使用的问题
kdevelop 3.5:configure:error:C ++编译器不能创build可执行文件
Django芹菜socket.error:连接被拒绝
sed -i 's?$([A-Z_]+)?${1}?g' file ;
我错过了什么? 我认为增加一些反斜杠将会有所帮助。我尝试添加一些但没有成功。
谢谢
用linux-redhat在java上出现内存exception
如何确定纯系统文件系统?
共享内存中的Shared_dirty vs Private_dirty
shebang线不工作
即使我忘了它,我怎么configuration我的“mv”命令来包含“-i”选项?
在Perl脚本中,您需要有效的Perl语言,就像在C程序中需要有效的C文本一样。 在终端sed..被shell理解和运行作为一个命令,但在Perl程序中,它只是一堆字,而行sed..是无效的Perl。
你需要在qx() (反引号)或system()这样做,以便它作为外部命令运行。 那么你确实需要“ 反斜杠 ”,这是事情有点挑剔的地方。
但为什么从Perl脚本运行sed命令? 用Perl做这个工作
use warnings; use strict; use File::copy 'move'; my $file = 'filename'; my $out_file = 'new_' . $file; open my $fh,'<',$file or die "Can't open $file: $!"; open my $fh_out,'>',$out_file or die "Can't open $out_file: $!"; while (<$fh>) { s/$( [^{] [a-z_]* )/${$1}/gix; print $fh_out $_; } close $fh_out; close $fh; move $out_file,$file or die "Can't move $out_file to $file: $!";
正则表达式使用否定字符类 [^...]来匹配除{之后的$以外的任何字符,因此不包括已加宽的单词。 然后它匹配一系列字母或下划线,就像在问题中一样(可能没有,因为第一个非{已经提供了至少一个)。
有了5.14+,你可以使用非破坏性 /r 修饰符
print $fh_out s/$([^{][a-z_]*)/${$1}/gir;
用这些字符串返回已更改的字符串(原始文件不变),即可进行print 。
输出文件,最后移动到原来的,应该使用File :: Temp 。 用这种方式覆盖原来的$file会改变$file的inode号码; 如果这是一个担心,看到这个帖子 ,例如,如何更新原始inode。
一个单行(命令行)版本,以方便测试
perl -wpe's/$([^{][a-z_]*)/${$1}/gi' file
这只打印到控制台。 要更改原始添加-i (in-place)或-i.bak以保持备份。
出现了一个合理的“ 没有更短的路 ”的问题。
这里是一个使用便利的Path :: Tiny的文件,这个文件不是很大,所以我们可以把它读成一个字符串。
use warnings; use strict; use Path::Tiny; my $file = 'filename'; my $out_file = 'new_' . $file; my $new_content = path($file)->slurp =~ s/$([^{][a-z_]*)/${$1}/gir; path($file)->spew( $new_content );
第一行将文件读入一个字符串,替换运行在该字符串上; 已更改的文本将被返回并分配给一个变量。 然后用新文本的变量写在原文上。
这两行可以被压缩成一个,通过从第一个而不是在第二个变量的表达。 但是在一个(复杂的)语句中两次打开相同的文件并不是完全可行的,我不推荐这样的代码。
但是,由于模块版本0.077,你可以很好地做
path($file)->edit_lines( sub { s/$([^{][a-z_]*)/${$1}/gi } );
所以这切成了一条不错的路线。
我想补充的是,削减代码行大多是不值得的努力,如果它确实会导致麻烦,如果它扰乱了代码结构和正确性的焦点,即使有点。 然而, Path::Tiny是一个很好的模块,这是合法的,但它确实缩短了一些。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。