我需要通过脚本修改文件
我需要做以下事项:
如果某个特定字符串不存在,则将其附加。
所以我创建了以下脚本:
#!/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”
否则附加字符串(就像我一样)但是在最后一个评论块开始之前
我怎么能这样做?
我不擅长编写脚本。
谢谢!
答案 0 :(得分:7)
首先,更改任何SomeParameter
行(如果已存在)。这应该适用于SomeParameter
或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
答案 1 :(得分: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#"}}
- 最后添加文件末尾的行
答案 2 :(得分:-1)
perl one-liner
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.pl
或chmod 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"