仅当行不存在时,如何将一行添加到不同子目录下的多个文本文件?
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 中执行插入操作? [复制]
当行不存在时,“SELECT FOR UPDATE”是不是会阻止其他连接插入?
7zip:在C#中,如何将不同目录下的多个同名文件添加到同一个zip文件中?