【问题标题】:Regex to replace a string in context but not the context正则表达式替换上下文中的字符串而不是上下文
【发布时间】:2014-09-01 01:35:45
【问题描述】:

我是regex 的新手,想做以下任务:

我有一个字符串说,JOHN.S,我想用制表符替换句点。但是,仅当句点在两个字母之间时才应进行替换。我不希望它发生的事情是用标签替换John, S. 中的句点。相反,我将用一个标签替换,,我知道该怎么做。

如果我尝试替换/[a-zA-Z]\.[a-zA-Z]/,那么周围的字母将被删除,但显然我想保留它们。它们应该只用于识别上下文。

我找了很久,没有找到解决办法。更具体地说,我正在使用bash。所以也许sed 是我要使用的。

谢谢。

【问题讨论】:

    标签: regex linux bash replace sed


    【解决方案1】:

    只需使用() 捕获周围信息并使用\1\2 等将它们打印回来:

    sed -r 's/(\w)\.(\w)/\1\t\2/g' file
    

    使用你的语法:

    sed -r 's/([a-zA-Z])\.([a-zA-Z])/\1\t\2/g' file
    

    测试

    $ cat file
    John, S.
    JOHN.S
    blabla
    
    $ sed -r 's/(\w)\.(\w)/\1\t\2/g' file
    John, S.
    JOHN    S
    blabla
    

    【讨论】:

    • 这在 mac 上不起作用...我没有 -r 选项,在查看手册后我发现 -E 应该用于扩展正则表达式。但是,使用\w 进行匹配没有任何效果。使用[a-zA-Z] 将离开这一行:JohntS 而不是John(tab)S。我的sed 是 BSD 2005 年 5 月版。
    • 那么您可以摆脱-r 并使用\(\) 来捕获群组:sed 's/\([a-zA-Z]\)\.\([a-zA-Z]\)/\1\t\2/g' file
    • 这仍然打印JohntS。如果我将\t 替换为\\t,它将按字面意思打印John\tS。你知道那里发生了什么吗?
    • 哦,刚刚想通了。看来我需要一个文字标签(使用Ctrl-V Tab 输入)。那就对了。
    • 很好读,我认为 \t 会成功的。如果您完成了,您可以将答案标记为已接受。
    猜你喜欢
    • 1970-01-01
    • 2012-10-11
    • 2018-10-30
    • 1970-01-01
    • 1970-01-01
    • 2021-10-10
    • 2013-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多