5

我需要通过脚本修改文件。
我需要执行以下操作:
如果特定字符串不存在,则附加它。

所以我创建了以下脚本:

#!/bin/bash  
if grep -q "SomeParameter A" "./theFile"; then  
echo exist  
else  
   echo doesNOTexist  
   echo "# Adding parameter" >> ./theFile    
   echo "SomeParameter A" >> ./theFile    
fi

这可行,但我需要做一些改进。
我认为如果我检查“SomeParameter”是否存在然后看看它后面是“A”还是“B”会更好。如果是“B”,则将其设为“A”。
否则附加字符串(就像我一样)但在最后一个注释块的开始之前。
我怎么能这样做?
我不擅长编写脚本。
谢谢!

4

3 回答 3

7

首先,更改任何SomeParameter已经存在的行。这应该适用于SomeParameteror之类的行SomeParameter B,带有任意数量的额外空格:

sed -i -e 's/^ *SomeParameter\( \+B\)\? *$/SomeParameter A/' "./theFile"

如果它不存在,则添加该行:

if ! grep -qe "^SomeParameter A$" "./theFile"; then
    echo "# Adding parameter" >> ./theFile    
    echo "SomeParameter A" >> ./theFile    
fi
于 2012-10-23T09:37:58.443 回答
2
awk 'BEGIN{FLAG=0}
     /parameter a/{FLAG=1}
     END{if(flag==0){for(i=1;i<=NR;i++){print}print "adding parameter#\nparameter A#"}}' your_file

BEGIN{FLAG=0}- 在文件处理开始之前初始化标志变量。

/parameter a/{FLAG=1}- 如果在文件中找到参数,则设置标志。

END{if(flag==0){for(i=1;i<=NR;i++){print}print "adding parameter#\nparameter A#"}}- 最后在文件末尾添加行

于 2012-10-22T09:19:23.383 回答
-1

perl 单行

perl -i.BAK -pe 'if(/^SomeParameter/){s/B$/A/;$done=1}END{if(!$done){print"SomeParameter A\n"}} theFile

将创建备份 theFile.BAK(-i 选项)。一个更详细的版本,考虑到最后的评论,要测试。应保存在文本文件中并执行perl my_script.plchmod u+x my_script.pl ./my_script.pl

#!/usr/bin/perl

use strict;
use warnings;

my $done = 0;
my $lastBeforeComment;
my @content = ();
open my $f, "<", "theFile" or die "can't open for reading\n$!";
while (<$f>) {
  my $line = $_;
  if ($line =~ /^SomeParameter/) {
    $line =~ s/B$/A/;
    $done = 1;
  }
  if ($line !~ /^#/) {
    $lastBeforeComment = $.
  }
  push @content, $line;
}
close $f;
open $f, ">", "theFile.tmp" or die "can't open for writting\n$!";
if (!$done) {
  print $f @content[0..$lastBeforeComment-1],"SomeParameter A\n",@content[$lastBeforeComment..$#content];
} else {
  print $f @content;
}
close $f;

一旦确定,然后添加以下内容:

rename "theFile.tmp", "theFile"
于 2012-10-22T08:59:09.660 回答