【问题标题】:Insert space after period using sed使用 sed 在句号后插入空格
【发布时间】:2012-05-18 11:07:15
【问题描述】:

我有一堆文件的句子结尾是这样的:\@.Next sentence。我想在句号之后插入一个空格。

不过,并非所有出现的\@. 都没有空格,因此我的正则表达式会检查句点之后的下一个字符是否为大写字母。

因为我在句号之后检查一个字符,所以我不能只将\@. 替换为\@.,而且因为我不知道句号后面是什么字符,所以我被卡住了。

我当前的命令:

sed -i .bak -E 's/\\@\.[A-Z]/<SOMETHING IN HERE>/g' *.tex

如何获取匹配字符串的最后一个字母以在替换正则表达式中使用?

编辑:为了记录,我使用的是 sed 的 BSD 版本(我使用的是 OS X)——来自我的 previous question regarding sed,显然 BSD sed(或者至少是 Apple 版本)没有总是很好地使用 GNU sed 正则表达式。

【问题讨论】:

    标签: regex macos sed


    【解决方案1】:

    我认为以下是正确的:

    s/\\@\.[^\s]/\\@. /g
    

    仅当表达式后面没有空格时才替换它。

    【讨论】:

    • 这似乎不起作用:echo '\@.N|\@. Q' | sed -E 's/\@.[^\s]/\@. /g' 给了我\@. |\@. Q(咀嚼 N)。
    【解决方案2】:

    这可能对你有用:

    sed -i .bak -E 's/\\@\. \?/\\@. /g' *.tex
    

    解释:

    如果有空格,用空格替换,否则插入空格。

    【讨论】:

      【解决方案3】:

      使用这个 sed 命令:

      sed -i.bak -E 's/(\\@\.)([A-Z])/\1 \2/g' *.tex
      

      或者更好:

      sed -i.bak -E 's/(\\@\.)([^ \t])/\1 \2/g' *.tex
      

      如果\@. 后面没有任何空白字符(不仅仅是大写字母),则会插入空格。

      【讨论】:

        【解决方案4】:

        正确的命令应该是这样的:

        sed -i.bak -E "s/\\\@.(\S)/\\\@. \1/g" *.tex
        

        使用它,您可以匹配任何 \@ 后跟非空格 (\S) 并插入一个空格(将整个匹配替换为 '\@ ' 加上刚刚找到的非空格)。

        【讨论】:

        • 这似乎不起作用:echo '\@.N|\@. Q' | sed -E 's/\\\@.(\S)/\\\@. \1/g' 返回\@.N|\@. Q(预期为\@. N|\@. Q;未插入空格)。
        • 奇怪,因为我得到了想要的结果。我正在运行 sed 4.2.1。你的是哪个版本的?
        • 很高兴知道这一点。也许您的sed 版本可以选择使其表现得像GNU sed。但是如果你有gsed 那么一切都很好。
        猜你喜欢
        • 1970-01-01
        • 2021-04-08
        • 2021-11-01
        • 2021-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-11
        相关资源
        最近更新 更多