首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sed/awk:只有在前面有一个特定的非空白字符时,才用另一个字符替换所有出现的字符

sed/awk:只有在前面有一个特定的非空白字符时,才用另一个字符替换所有出现的字符
EN

Stack Overflow用户
提问于 2019-12-06 17:33:26
回答 1查看 42关注 0票数 1

上下文是将一些结构化数据转换为JSON/YAML,当某些名称错误地包含破折号(Es)时,它们的前面是冒号(:)。

例如,让我们考虑以下结构化数据:

代码语言:javascript
复制
-   name-1: value-1
    name-2:
    - value-21
    - value-22
-   name-3: value-3
    name-4:
    - value-41
    - value-42

其目标是将前者转变为YAML:

代码语言:javascript
复制
-   name_1: value-1
    name_2:
    - value-21
    - value-22
-   name_3: value-3
    name_4:
    - value-41
    - value-42

陷阱涉及所有列出的值,这些值后面没有冒号。

我尝试了以下(受类似职位启发),但它错误地修改了列表中的值:

代码语言:javascript
复制
sed -E ':l; s/^([^:]*)*-([^[:blank:]]+)/\1_\2/; tl;' file
-   name_1: value-1
    name_2:
    - value_21
    - value_22
-   name_3: value-3
    name_4:
    - value_41
    - value_42

有什么建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-06 18:12:04

你可以用

代码语言:javascript
复制
sed -E ':l; s/^([[:blank:]]*(-[[:blank:]]*)?[^[:space:]:-]*)-([^[:space:]:]*:)/\1_\3/; tl;' file > newfile

演示

regex工作像这样

  • ^ -字符串的开始
  • ([[:blank:]]*(-[[:blank:]]*)?[^[:space:]:-]*) - Group 1 (\1):0+水平空白,是-和0+水平空白空间的可选序列,然后是0+ chars,而不是空格、:-
  • - -a连字符
  • ([^[:space:]:]*:) -第3组(\3):除空白和:以外的0或更多字符,然后是:

由于-标签和t循环,对键中的所有t都进行了更改。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59217850

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档