【问题标题】:gsub regex patterngsub 正则表达式模式
【发布时间】:2013-03-13 23:25:31
【问题描述】:

我正在使用 gsub 用逗号替换制表符

gsub(/\t/,\",\")

a\tb will be a,b

在某些情况下,我有两个彼此紧随的标签 例如

a/t/tb 

在这种情况下,gsub 将其转换为 a,,b 我希望在这种情况下,字符串应转换为 a,-,b(中间有一个减号)。

我尝试编写两个单独的 gsubs

gsub(/\t/,\",\") // for tab

gsub(/,,/,\"/,-,/\") // for consecutive commas

第二个似乎不起作用。

这有什么问题。有没有办法,我可以将两者合二为一gsub

【问题讨论】:

    标签: regex shell gsub


    【解决方案1】:

    我认为您是在问关于 awk 的问题? 我不认为它可以用一个 gsub 完成,实际上我需要三个:

    $ abc=$(echo 'a.b..c...d....e.....f' | tr . '\t')
    
    $ echo "$abc" | awk '{gsub(/\t/, ","); gsub(/,,/, ",-,"); gsub(/,,/, ",-,"); print}'
    a,b,-,c,-,-,d,-,-,-,e,-,-,-,-,f
    

    问题是/,,/ 上的单个 gsub 将消耗两个逗号,因此如果有三个或更多连续的逗号,它将在下一对逗号之间留下一个间隙。在更强大的正则表达式引擎(例如 Perl)中,可以使用前瞻功能一次性完成:

    $ echo "$abc" | perl -pe 's/\t/,/g; s/,(?=,)/,-/g;'
    a,b,-,c,-,-,d,-,-,-,e,-,-,-,-,f
    

    【讨论】:

    • 非常感谢。我在 awk 中使用它。
    猜你喜欢
    • 2013-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多