使用sed替换具有匹配模式的行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用sed替换具有匹配模式的行相关的知识,希望对你有一定的参考价值。

我想替换这一行

command: [ "--no-save", "--no-restore", "--slave", "/home/app/src/work-daily.py", "20180212"]

command: [ "--no-save", "--no-restore", "--slave", "/home/app/src/work-daily.py", "20180305"]

20180305是今天我将其价值存储在变量日期中的日期

我的方法是

sed 's/.*command.*/"command: [ "--no-save", "--no-restore", "--slave", "/home/app/src/work-daily.py", "$dated"]"/' ghj.txt

哪里

dated=$(date +%Y%m%d)

它给出了类似的错误

sed:-e表达式#1,char 81:`s'的未知选项

答案

您的命令可以在引用和转义中进行一些更改:

$ sed 's/.*command.*/command: [ "--no-save", "--no-restore", "--slave", "/home/app/src/work-daily.py", "'"$dated"'"]/' ghj.txt
command: [ "--no-save", "--no-restore", "--slave", "/home/app/src/work-daily.py", "20180305"]

看起来您只想更改包含字符串command:的行的最后一个字段。在这种情况下,sed命令可以简化为:

$ sed -E "/command:/ s/"[[:digit:]]+"]/"$dated"]/" ghj.txt
command: [ "--no-save", "--no-restore", "--slave", "/home/app/src/work-daily.py", "20180305"]

或者,使用awk:

$ awk -F" -v d="$dated" '/command:/{$10=d} 1' OFS=" ghj.txt
command: [ "--no-save", "--no-restore", "--slave", "/home/app/src/work-daily.py", "20180305"]
另一答案

我会推荐awk来完成这项任务

您可以通过在date中调用awk来实时替换最后一个字段

$ awk -F, -v OFS=, 'BEGIN{"date +%Y%m%d" | getline d} {$NF=" ""d""]"}1' file
command: [ "--no-save", "--no-restore", "--slave", "/home/app/src/work-daily.py", "20180305"]

"date +%Y%m%d" | getline d;:日期将在d存储

$NF=" ""d""]":用格式"date"]替换最后一个字段

另一答案

您可以使用以下sed命令:

$ cat input; dated=$(date +%Y%m%d); sed "/.*command: [ "--no-save", "--no-restore", "--slave", ".*work-daily.py", "20180212"]/s/201
80212/$dated/" input                                                                                                                         
command: [ "--no-save", "--no-restore", "--slave", "/home/app/src/work-daily.py", "20180212"]
command: [ "--no-save", "--no-restore", "--slave", "/home/app/src/work-daily.py", "20180305"]

其中/.*command: [ "--no-save", "--no-restore", "--slave", ".*work-daily.py", "20180212"]/用于在文件中找到正确的行,s/20180212/$dated/用于替换。

以上是关于使用sed替换具有匹配模式的行的主要内容,如果未能解决你的问题,请参考以下文章

sed用法

Sed命令详解+如何替换换行符

Sed 实记 · laoless‘s Blog

sed命令:删除匹配行和替换

Linux三剑客(sed)-编辑匹配到的文本

sed