如何用Sed命令匹配含指定字符串的行并替换部分内容?
解决sed替换无匹配的问题
你的sed命令失效主要有三个原因:
- 单引号嵌套错误:直接在单引号包裹的sed表达式里写单引号,shell会把它当成表达式的结束符,导致语法混乱
- 正则语法不兼容:sed默认使用基础正则表达式,
{40}需要转义成\{40\}才能表示重复40次,否则会被当成普通字符 - 多余的连续单引号:你写的
''([a-z0-9]{40})''是无效语法,正确的应该是匹配单引号内的哈希值
下面给你几个可用的正确命令:
方法1:用双引号包裹sed表达式(最直观)
sed -i "s/'new_revision':'[a-z0-9]\{40\}'/'new_revision':'000c0000b08b96c987482e08d28d84ea3d777eml'/" file
双引号内可以直接使用单引号,不需要转义,同时把{40}转义成\{40\}适配sed的基础正则。
方法2:用扩展正则(简化正则写法)
给sed加-r选项启用扩展正则,这样{40}不需要转义:
sed -i -r "s/'new_revision':'[a-z0-9]{40}'/'new_revision':'000c0000b08b96c987482e08d28d84ea3d777eml'/" file
方法3:不限制哈希长度(容错性更高)
如果不确定哈希的精确长度,或者只要替换所有new_revision字段的值,可以直接匹配单引号内的任意内容:
sed -i "s/\('new_revision':'[^']*\)/\1000c0000b08b96c987482e08d28d84ea3d777eml'/" file
这个命令会匹配'new_revision':'开头的部分,然后替换后面直到下一个单引号的所有内容为目标字符串,不管原哈希多长都能生效。
内容的提问来源于stack exchange,提问作者Mudita Tandon
相关产品推荐
相关产品推荐

