我们有要求我需要在配置文件中替换部分参数值。
示例
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可以更简单地完成此命令,这将很有帮助。
答案 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_]
表示-