我有一个看起来像这样的文件:
VAR1="one two three"
VAR2="four five six"
VAR3="seven eight nine"
我试图找到一个修改该文件的命令,就像这样:
/^VAR2=".*?"/
匹配的行#
,然后附加今天的日期(例如# 2019-02-04
)test
,并在行末添加#
和今天的日期所以最终结果如下:
VAR1="one two three"
# VAR2="four five six" # 2019-02-04
VAR2="four five six test" # 2019-02-04
VAR3="seven eight nine"
我可以使用此sed
来做到这一点,并且它可以工作,但是我也希望它让我知道一个状态:是的,它找到了线并进行了询问,否则,它没有找到线。
sed -i -r -e "s/^(VAR2=\".*?)(\")/# \1\2 # $(date +'%Y-%m-%d')\n\1 test\2 # $(date +'%Y-%m-%d')/" file
如果有关系,替换字符串中将永远不会包含正则表达式。
我愿意采取更好的方法。基本上,目的是编辑配置文件并将字符添加到变量值,并复制行和注释以用于备份。
答案 0 :(得分:1)
我会像这样使用Perl馅饼:
$ cat yourfile.txt
VAR1="one two three"
VAR2="four five six"
VAR3="seven eight nine"
$ export d=`date +%Y-%m-%d` ; perl -p -i.old -e 'my $date = $ENV{d}; s/^VAR2(.*)"$/#VAR2\1" # $date\nVAR2\1 test" # $date/g' yourfile.txt
$ echo $?
0
$ cat yourfile.txt
VAR1="one two three"
#VAR2="four five six" # 2019-02-04
VAR2="four five six test" # 2019-02-04
VAR3="seven eight nine"
如果您想要“状态”,请尝试以下操作:
$ cat yourfile2.txt
VAR1="one two three"
VAR3="seven eight nine"
$ export d=`date +%Y-%m-%d` ; perl -p -i.old -e 'my $date = $ENV{d}; s/^VAR2(.*)"$/#VAR2\1" # $date\nVAR2\1 test" # $date/g' yourfile.txt ; grep "^VAR2" yourfile2.txt > /dev/null
$ echo $?
1
如果发生更改,-i.old
将提供具有指定扩展名的备份文件:
$ cat yourfile.txt.old
VAR1="one two three"
VAR2="four five six test"
VAR3="seven eight nine"
答案 1 :(得分:1)
编辑: :由于注释中提到了OP,因此,如果找到与VAR2
开头的行匹配,则需要打印op,因此请在{ {1}}。
awk
其中awk -v dat="$dat" '
/^VAR2.*/{
found=1
}
found && /^VAR2.*/{
print "Line starting with VAR2 has been found on Line " FNR "."
$0="# " $0 " # " dat ORS $0 " # " dat
}
{
print > "temp"
}
END{
if(!found){
print "NO line starting with VAR2 found."
}
}' Input_file && mv temp Input_file
是dat
变量,其中具有awk
shell变量的值。输出如下。
dat
能否请您尝试以下。您可以创建一个BASH变量,该变量具有系统日期的值,然后可以在VAR1="one two three"
Line starting with VAR2 has been found on Line 2.
# VAR2="four five six" # 2019-02-05
VAR2="four five six" # 2019-02-05
VAR3="seven eight nine"
中使用它作为整洁的过程。
sed
输出如下。
cat << EOF > Input_file
VAR1="one two three"
VAR2="four five six"
VAR3="seven eight nine"
EOF
dat=$(date +%Y-%m-%d)
echo $dat
sed "/^VAR2.*/s/^VAR2.*/# & # $dat\n& # $dat/g" Input_file