使用sed替换匹配模式的行

4

我想要替换这行代码

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 是今天的日期,我将其存储在一个名为dated的变量中。

我的方法是:

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,字符 81:未知选项 `s'


这是一个与 sed 命令相关的错误。

单引号不会扩展变量!并将分隔符从“/”更改为任何其他字符“|”或“#”。 - Inian
1
请参考以下两个与Bash变量和sed替换相关的Stack Overflow链接:https://dev59.com/0Wsz5IYBdhLWcg3wwKqh 和 https://dev59.com/Am025IYBdhLWcg3wr4B6。此外,您最好尝试简化命令,例如`/^command/ s/<match at end>/<replace>/`。 - Sundeep
3个回答

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
我会推荐使用awk来完成这项任务。
您可以通过在awk内调用date函数来实时替换最后一个字段。
$ 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"]替换最后一个字段。


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/进行替换。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接