在shell脚本

时间:2018-05-14 14:29:11

标签: string bash shell

我有一个文件,其中包含一些字符串,例如文件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检查,但它只提供第一个匹配,也找不到替换子字符串的方法

1 个答案:

答案 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用于表示文件的结尾。