【问题标题】:Character replacement inside multiple matched pattern [duplicate]多个匹配模式中的字符替换[重复]
【发布时间】:2017-11-08 07:21:00
【问题描述】:

假设我有一个这样的句子

The quick, (brown, fox) jumps over, the (lazy, old, dog)

我想将括号 () 内的所有逗号 , 替换为冒号 :,但是不应该替换括号中的逗号。输出应该是这样的

The quick, (brown: fox) jumps over, the (lazy: old: dog)

请注意,每个句子中逗号和括号的数量不是固定的。 如何使用 shell 相关工具(bash、sed、awk 等)来达到这个效果?

我尝试使用sed 's/[^(]*\(([^)]*)\)/\1/g; s/,/:/g' 替换所有匹配的组,但不知道如何将结果插入到原始句子中。

【问题讨论】:

    标签: regex bash shell awk sed


    【解决方案1】:

    如果您的实际 Input_file 与显示的 Input 相同,那么以下内容可能会对您有所帮助。

    awk -F"[)(]" '{for(i=2;i<=NF;i+=2){gsub(/,/,":",$i);$i="("$i")"}} 1'  Input_file
    

    输出如下。

    The quick,  (brown: fox)  jumps over, the  (lazy: old: dog)
    

    【讨论】:

    • 使用带有第 2 步增量的循环的好主意!但是似乎产生了一些额外的空间,有什么办法可以避免呢?
    • OFS=""解决了这个问题,谢谢!
    • @etopylight,很高兴能帮到你。看到这个stackoverflow.com/help/someone-answers
    • @etopylight 你确定它按预期工作吗?尝试将, even more :) with smilies 添加到测试字符串中。 This is the correct awk answer(只需将sub 更改为gsub)。
    • @WiktorStribiżew 好收获!这是一个更强大的解决方案,可以很好地处理未闭合的括号。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-20
    • 1970-01-01
    • 2022-01-21
    • 2014-03-22
    相关资源
    最近更新 更多