sed正则表达式匹配精确的模式并忽略某些模式



我有一个YML,其中需要用双引号附加数字。我尝试了各种正则表达式,但不知怎么的,它在某个地方坏了。我需要避免字母数字或字母。。。

- name: HEALTH_ELASTIC_HOST 
value: 40c07d4283d245.elastic.test.com
- name: HEALTH_ELASTIC_PORT
value: 9243
- name: HEALTH_ELASTIC_USERNAME
value: elastic

我采取的基本命令,并修改

sed 's/[0-9]*[0-9]/"&"/g' values.yaml

预期结果

- name: HEALTH_ELASTIC_HOST 
value: 40c07d4283d245.elastic.test.com
- name: HEALTH_ELASTIC_PORT
value: "9243"
- name: HEALTH_ELASTIC_USERNAME
value: elastic

任何帮助都将不胜感激。。链接到任何文档或cmd。

您可以使用此sed:

sed -E 's/([: ]+)([0-9]+) *$/1"2"/' file.yml
- name: HEALTH_ELASTIC_HOST
value: 40c07d4283d245.elastic.test.com
- name: HEALTH_ELASTIC_PORT
value: "9243"
- name: HEALTH_ELASTIC_USERNAME
value: elastic

解释:

  • ([: ]+):匹配:的1+或空间并在组2中捕获
  • ([0-9]+):在第2组中匹配1位以上的捕获
  • *:匹配0个或多个空格
  • $:匹配结束位置
  • 1"2":在替换中,我们用双引号回写引用#2

对于您显示的示例,请尝试以下操作(专家建议使用类似yq的工具来编辑yaml,因为OP在这里使用sed,所以请继续使用(。

sed -E 's/(^[[:space:]]+value: )([0-9]+$)/1"2"/g' Input_file

解释:简单的解释是,使用sed-E选项启用ERE(扩展正则表达式(,然后在主程序中使用regex(^[[:space:]]+value: )([0-9]+$)sed的替代选项。Regex((^[[:space:]]+value: )([0-9]+$)(将创建两个捕获组,其中第一个捕获组中的值为:value:,第二个捕获组中将包含数字。

然后在进行替换时,根据需要简单地将其替换为第一捕获组,然后是",第二捕获组,之后是"

最新更新