仅当行不存在时,如何将一行添加到不同子目录下的多个文本文件?

Posted

技术标签:

【中文标题】仅当行不存在时,如何将一行添加到不同子目录下的多个文本文件?【英文标题】:How to add a line to multiple text files under different sub-directories only if the line doesn't exist? 【发布时间】:2020-02-15 20:20:40 【问题描述】:

我有一个名为“technology”的目录,在“technology”目录下我有多个子目录,最多嵌套两个级别。

在每个子目录下,我至少有一个“*.txt”文件,其中最多可以包含 20 到 30 行条目。

现在,我想在跨多个子目录的每个 *.txt 文件中添加“备注”行,前提是该行不存在。

我正在使用以下方式获取子目录下所有文件的列表:

find ./ -name '*.txt'

我正在使用下面提到的 Perl 脚本来更新条目,新的注释如下所示。

/technology$ perl -p -i -e 's/Remarks.*/Remarks: NEW Value/'   'find ./ -name *.txt'

上述脚本的问题是它只更新现有的备注字段。

我怎样才能只在那些实际上还没有的文件中添加一个条目(一行注释)?

我只想在那些不包含“备注行”的文件中添加行。

【问题讨论】:

【参考方案1】:

如果要更新已包含此类行的文件中包含 Remarks 的行,或者您希望保持这些文件不变并且只在那些文件末尾添加一行,则并不完全清楚'不包含备注。

幸运的是,没有太大区别。此代码适用于“编辑现有的 Remarks 行;如果还没有,请添加新的 Remarks 行”:

#!/usr/bin/env perl -i

use strict;
use warnings;

my $num_remarks = 0;

while (<>)

    $num_remarks++ if s/Remarks.*/Remarks: NEW Value $$/;
    print;

continue

    if (eof)
    
        print "Remarks: NEW Value $$\n" if $num_remarks == 0;
        $num_remarks = 0;
    

替代要求“保持现有的Remarks 行不变;如果没有,则添加一个新的Remarks 行”可以通过以下方式处理:

#!/usr/bin/env perl -i

use strict;
use warnings;

my $num_remarks = 0;

while (<>)

    $num_remarks++ if m/Remarks/;   # m// instead of s///
    print;

continue

    if (eof)
    
        print "Remarks: NEW Value $$\n" if $num_remarks == 0;
        $num_remarks = 0;
    

可能有更短的方法来编写此代码。两种变体都在添加时在“备注”行中包含 Perl 进程的 PID。这样可以更轻松地查看更改的时间。

【讨论】:

我编辑问题。并提到我只想在那些不包含备注的文件末尾添加一行。 此解决方案如何适用于技术目录下的所有子目录?

以上是关于仅当行不存在时,如何将一行添加到不同子目录下的多个文本文件?的主要内容,如果未能解决你的问题,请参考以下文章

仅当行不存在时,如何在 SQL Server 中执行插入操作? [复制]

仅当行不存在时才插入 SQL

当行不存在时,“SELECT FOR UPDATE”是不是会阻止其他连接插入?

7zip:在C#中,如何将不同目录下的多个同名文件添加到同一个zip文件中?

仅当更新前不存在用户时如何将用户添加到索引 Elasticsearch

仅当行填充等于 3 个字节时,C++ 读取 BMP 文件才有效