如何在 Perl 中更改、删除或插入文件中的行,或附加到文件的开头?

2024-01-22

人们不断地问这个问题,我也不断地用同样的答案来回答它perlfaq5 http://faq.perl.org/perlfaq5.html#How_do_I_change_dele。现在我们可以在 Stackoverflow 上指出这一点。


From perlfaq5 http://faq.perl.org/perlfaq5.html#How_do_I_change_dele:

从文本文件中插入、更改或删除行的基本思想包括读取并打印文件到要进行更改的位置,进行更改,然后读取并打印文件的其余部分。 Perl 不提供对行的随机访问(特别是因为记录输入分隔符,$/,是可变的),尽管诸如领带::文件 http://search.cpan.org/perldoc?Tie::File可以伪造它。

执行这些任务的 Perl 程序采用的基本形式是打开文件、打印其行,然后关闭文件:

open my $in,  '<',  $file      or die "Can't read old file: $!";
open my $out, '>', "$file.new" or die "Can't write new file: $!";

while( <$in> )
    {
    print $out $_;
    }

close $out;

在该基本表单中,添加插入、更改或删除行所需的部分。

要将行添加到开头,请在进入打印现有行的循环之前打印这些行。

open my $in,  '<',  $file      or die "Can't read old file: $!";
open my $out, '>', "$file.new" or die "Can't write new file: $!";

print $out "# Add this line to the top\n"; # <--- HERE'S THE MAGIC

while( <$in> )
    {
    print $out $_;
    }

close $out;

要更改现有行,请插入代码以修改while环形。在这种情况下,代码找到“perl”的所有小写版本并将它们转为大写。每行都会发生这种情况,因此请确保您应该在每行都执行此操作!

open my $in,  '<',  $file      or die "Can't read old file: $!";
open my $out, '>', "$file.new" or die "Can't write new file: $!";

print $out "# Add this line to the top\n";

while( <$in> )
    {
    s/\b(perl)\b/Perl/g;
    print $out $_;
    }

close $out;

仅更改特定行,输入行号,$.,很有用。首先阅读并打印直到您要更改的行。接下来,读取要更改的单行,更改它,然后打印它。之后,阅读其余行并打印它们:

while( <$in> )   # print the lines before the change
    {
    print $out $_;
    last if $. == 4; # line number before change
    }

my $line = <$in>;
$line =~ s/\b(perl)\b/Perl/g;
print $out $line;

while( <$in> )   # print the rest of the lines
    {
    print $out $_;
    }

要跳过行,请使用循环控件。这next在此示例中跳过注释行,并且last一旦遇到任何一个,就停止所有处理__END__ or __DATA__.

while( <$in> )
    {
    next if /^\s+#/;             # skip comment lines
    last if /^__(END|DATA)__$/;  # stop at end of code marker
    print $out $_;
    }

使用同样的方法删除特定行next跳过您不想在输出中显示的行。此示例每隔五行跳过一次:

while( <$in> )
    {
    next unless $. % 5;
    print $out $_;
    }

如果出于某种奇怪的原因,您确实想立即查看整个文件而不是逐行处理,则可以将其吞入其中(只要您可以将整个文件放入内存!):

open my $in,  '<',  $file      or die "Can't read old file: $!"
open my $out, '>', "$file.new" or die "Can't write new file: $!";

my @lines = do { local $/; <$in> }; # slurp!

    # do your magic here

print $out @lines;

模块如文件::啜饮 http://search.cpan.org/perldoc?File::Slurp and 领带::文件 http://search.cpan.org/perldoc?Tie::File也可以提供帮助。但是,如果可以的话,请避免一次读取整个文件。在进程完成之前,Perl 不会将内存返还给操作系统。

您还可以使用 Perl 语句就地修改文件。以下将所有“Fred”更改为“Barney”inFile.txt,用新内容覆盖文件。随着-pswitch,Perl 包装了一个while循环您指定的代码-e, and -i打开就地编辑。当前行位于$_. With -p, Perl 自动打印的值$_在循环的末尾。看perlrun http://perldoc.perl.org/perlrun.html更多细节。

perl -pi -e 's/Fred/Barney/' inFile.txt

进行备份inFile.txt, give -i要添加的文件扩展名:

perl -pi.bak -e 's/Fred/Barney/' inFile.txt

要仅更改第五行,您可以添加测试检查$.,输入行号,则仅在测试通过时才执行操作:

perl -pi -e 's/Fred/Barney/ if $. == 5' inFile.txt

要在特定行之前添加行,您可以在 Perl 打印之前添加一行(或多行!)$_:

perl -pi -e 'print "Put before third line\n" if $. == 3' inFile.txt

您甚至可以在文件的开头添加一行,因为当前行打印在循环的末尾:

perl -pi -e 'print "Put before first line\n" if $. == 1' inFile.txt

要在文件中已有的一行之后插入一行,请使用-n转变。就像-p除了它不打印$_在循环的末尾,所以你必须自己做。在这种情况下,打印$_首先,然后打印您要添加的行。

perl -ni -e 'print; print "Put after fifth line\n" if $. == 5' inFile.txt

要删除行,只打印您想要的行。

perl -ni -e 'print unless /d/' inFile.txt

    ... or ...

perl -pi -e 'next unless /d/' inFile.txt
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Perl 中更改、删除或插入文件中的行,或附加到文件的开头? 的相关文章

随机推荐

  • 发现存储特定面向对象数据结构的最佳方法

    经过一些奇妙的建议 以及由于最终有可能解决我的问题而兴奋的不眠之夜 我意识到我仍然没有完全找到解决方案 因此 我在这里更详细地概述我的问题 希望有人知道实现这一目标的最佳方法 回顾一下 如果你还没有读过上一篇文章 https stackov
  • 快速 count() 两个字符串数组的交集

    我需要计算两个大字符串数组的交集对应的元素数量 并且速度非常快 我正在使用以下代码 arr1 i Intersect arr2 j Count 对于 CPU 时间 VS Profiler 指示 85 1 在System Linq Enume
  • Redis扫描跳过键

    我正在使用 predis 如果有什么区别的话 可以使用 laravel php 客户端来与 Redis 一起工作 我需要从 Redis 获取与特定前缀匹配的所有键 我这样做 keys foreach new Iterator Keyspac
  • 我可以关闭 Kramdown 中的代码块吗?

    我可以关闭 Jekyll 中的代码块吗 它将使我的 md 文件更具可读性 我在内联 HTML 和包含文件中都遇到这个问题 我使用 Jekyll 创建网站 从不需要代码块 现在我将样式放入 HTML 中 如下所示 div class cool
  • Angular 5 + Angular Material Select + Reactive Forms == 没有显示初始选项

    正如标题所说 我有一个反应形式 有多个
  • 这个命令在 bash 中起什么作用: ,_,( ){ ,_,| ,_,&};,_,

    我不确定这意味着什么 看起来像 bash 命令 但它可能是 bash shell 指令或其他东西 如果有人可以帮助理解这一点 我将不胜感激 当我运行它时它杀死了我的bash It s a 叉子炸弹 http en wikipedia org
  • C++ 和 C 可变参数如何一起使用?

    通常 将 C 11 可变参数模板功能与函数一起使用需要基于可变参数的函数参数位于函数参数列表中的最后一个 有一个例外 如果存在 C 级可变参数 它们是倒数第二个参数 这必须是最后一个 template lt typename Args gt
  • 编辑 plist 中的现有数据

    通过编码检查数据是否已经存在后 如何覆盖 plist 中的现有数据 详细地 我将用户名和密码保存在位于文档目录中的 plist 文件中 现在 如果用户选择更改密码选项 plist 应检查他的用户名是否存在 如果存在 那么他输入的新密码应该覆
  • 更改微调器下拉宽度

    我需要调整该部分的大小以完全显示 我怎样才能做到这一点 我的适配器 String navigations getResources getStringArray R array actionBar ArrayAdapter
  • SSL 和中间人攻击

    我的印象是 自签名证书会带来中间人攻击的风险 因为中间人可以向客户端提供不同的自签名证书 我的问题如下 如果我在服务器上使用自签名证书 使用 SelfSSL 并且在运行 ssl 页面 这是一个管理页面 不面向公众 时 浏览器会向我发出警告
  • 如何打乱 ArrayList 的特定范围?

    在Java中 我知道要打乱ArrayList 存在Collections shuffle 方法 但是这会打乱整个列表 我如何编写一个方法 或者 有人可以编写它并向我展示吗 如下所示 private ArrayList
  • 启动 Core Data 应用程序时在后台配置 NSFetchedResultsController

    我已经使用通常的样板代码设置了一个 Core Data 应用程序 并且 RootViewController 通过调用以下命令来初始化 FRC NSFetchedResultsController fetchedResultsControl
  • websocket客户端连接服务器时出现SockJsException

    我使用带有 websocket 支持的 spring 4 0 3 我的 websocket spring 配置是
  • 如何将光标放在 NetBeans Java 文件模板中?

    我希望在 NetBeans 中创建接口 类等时将光标置于 JavaDoc 区域 您可以使用 cursor 对于非基于文件的模板 但这不适用于文件模板 lt if package package gt package package curs
  • 并发访问公共字段。为什么可以观察到不一致的状态?

    我正在阅读 B Goetz Java 并发实践 现在我正在阅读section 3 5关于安全出版 他说 Unsafe publication public Holder holder public void initialize holde
  • matchTemplate opencv 无法正常工作,如 opencv 文档中所示

    我正在努力解决这个问题 因为在我从相机捕获的图像中 我需要找到某些图案的存在和位置 为此我发现使用matchTemplateopencv的方法 我使用了opencv示例中使用的图像并编写了代码 但结果不同 http opencv itsee
  • 在 Swift 中动态调用函数

    我正在尝试在 Swift 中实现路由器模式 但不知道如何动态调用方法 例如 有一个参数数组 let arguments Any 100 0 5 Test 以及需要调用的处理程序 public class MyClass public fun
  • 自定义字体不适用于react-native-paper

    尝试将自定义字体 Tajawal Bold 和 Tajawal Medium 与我使用react native paper 的 RN 项目集成 仅限 Android 应用程序 我确实像react native paper的文档中所描述的那样
  • 如何在 SQL Server 中将时间类型变量除以 2

    我有一个类型变量TIME 我需要将这个变量的时间除以2 MySQL代码 DECLARE TEMPO AS TIME 01 31 00 SELECT TEMPO 2 AS RESULT the result should be 00 45 3
  • 如何在 Perl 中更改、删除或插入文件中的行,或附加到文件的开头?

    人们不断地问这个问题 我也不断地用同样的答案来回答它perlfaq5 http faq perl org perlfaq5 html How do I change dele 现在我们可以在 Stackoverflow 上指出这一点 Fro