Unix SED命令替换部分键值对

时间:2019-06-25 06:30:46

标签: unix sed

我们有要求我需要在配置文件中替换部分参数值。

示例

key1=123-456

我需要用新值替换连字符后的值。

我得到了正在其他项目中使用的命令,但是我不确定它是如何工作的。

命令

[test]$ cat test_sed_key_value.txt
key1=123-456
[test]$ sed -i -e '/key1/ s/-.*$/-789/' test_sed_key_value.txt
[test]$
[test]$ cat test_sed_key_value.txt
key1=123-789
[test]$

如果有人可以解释上述命令的方式或使用sed可以更简单地完成此命令,这将很有帮助。

2 个答案:

答案 0 :(得分:2)

以下是该命令行的一部分列表,每个部分后面都有简短说明:

sed 

使用哪个工具

-i

flag:直接将效果应用于已处理的文件(无需创建输入文件的副本)

-e

表达式参数:要应用的sed代码

/key1/

“地址”:仅适用于此正则表达式的处理行,即包含文本“ key1”的处理行

s/replacethis/withthis/

命令:执行一次搜索和替换,解释旁边是“ replacethis”和“ withthis”

-.*$

regex :(实际上是命令行中的内容,而不是“ replacethis”)是一个表示“减号”的正则表达式,后跟任意数量的任何数字,直到该行的结尾

-789

文字:(实际上是命令行中的内容,而不是“ withthis”)只是字符串“ -789”

test_sed_key_value.txt

文件参数:处理该文件

我想不出任何方法来简化此操作。所示命令已经对输入文件的格式使用了一些假设。

答案 1 :(得分:1)

我要在Yunnosch的答案中加上,“ replacethis”是一个正则表达式:

-.*$

有关Gnu的sed正则表达式语法的概述,请参见here。 星号表示重复前一个字符,点表示任何字符,因此.*表示字符序列。 $是这一行的结尾。

您可能希望限制一些,因为在这里您可能会丢失像这样的一行中的内容:

key1=123-456, key2=abc-def

替换为:

key1=123-789

完全删除key2部分(因为.*会在第一个破折号之后到行尾都包含所有字符)。

因此,根据您的值的格式,您可能更喜欢类似

-[0-9]*

(不包含$),表示-之后的数字序列

-[0-9a-zA-Z_]

表示-

之后的数字或字母或下划线的序列