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

时间:2018-03-05 07:23:41

标签: linux bash 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'

的未知选项

3 个答案:

答案 0 :(得分:1)

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

$ 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"]

答案 1 :(得分:1)

我会为此任务推荐 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"]

替换最后一个字段

答案 2 :(得分:0)

您可以使用以下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/用于替换。