我有一个文件,其中包含一些字符串,例如文件my_file.txt
,我有字符串
foo_eusa.r1
foo_chnc.r5
foo_deu.r10
.
.
.
现在我想检查一个子字符串是否存在于文件中,如果它存在,我想修改整个字符串,如果不存在,我会添加它。
例如,我有一个新字符串foo_eusa.r4
我想在文件中搜索子字符串foo_eusa
的所有出现。如果存在(在上面它存在foo_eusa.r1
),则将 r1 替换为 r4 ,以便字符串变为foo_eusa.r4
而不是foo_eusa.r1
在所有出现。如果foo_eusa
不存在,则添加新字符串foo_eusa.r4
我使用grep -q进行treid检查,但它只提供第一个匹配,也找不到替换子字符串的方法
答案 0 :(得分:-1)
Perl救援:
perl -i~ -pe 's/^foo_eusa\..*/foo_eusa.r4/ and $changed = 1;
END { print "foo_eusa.r4\n" unless $changed }' -- file
如果您需要处理多个文件,则会更复杂一些:
perl -i~ -ne '
s/^foo_eusa\..*/foo_eusa.r4/ and $changed = 1;
print;
if (eof) {
print "foo_eusa.r4\n" unless $changed;
$changed = 0;
}' -- file*
-i~
修改“就地”文件,留下~
扩展名的备份-p
逐行读取输入并在处理后输出每一行-n
与-p
类似,但除非告知print
$changed
用作标志。当触发替换时,它被设置为1.如果在END处不是1(即处理完成时),则将字符串添加到输出中。如果有多个文件,则必须为每个文件处理该标志,因此eof用于表示文件的结尾。