单行命令,将单词添加到文件中带引号的变量中,如果有效,则报告好坏

时间:2019-02-05 03:27:11

标签: regex sed

我有一个看起来像这样的文件:

VAR1="one two three"
VAR2="four five six"
VAR3="seven eight nine"

我试图找到一个修改该文件的命令,就像这样:

  1. 找到与正则表达式/^VAR2=".*?"/匹配的行
  2. 评论一下
  3. 附加#,然后附加今天的日期(例如# 2019-02-04
  4. 复制行,但在字符串内附加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

如果有关系,替换字符串中将永远不会包含正则表达式。

我愿意采取更好的方法。基本上,目的是编辑配置文件并将字符添加到变量值,并复制行和注释以用于备份。

2 个答案:

答案 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