【问题标题】:GNU sed - find or replacing spaces or new lines. Why is this not working? v3.02 vs v4.2GNU sed - 查找或替换空格或换行符。为什么这不起作用? v3.02 与 v4.2
【发布时间】:2010-07-26 01:46:09
【问题描述】:
C:\crp\cnp>sed -V

GNU sed version 3.02

Copyright (C) 1998 Free Software Foundation, Inc.......


C:\crp\cnp>type f.f

a a a

a a a

试图用空格替换“a”。

C:\crp\cnp>type f.f | sed -e s/a/\d032/g

d032 d032 d032

d032 d032 d032

为什么它不起作用?

我不介意我是否正在查找或替换空格或换行符。我只想能够指定它们。它似乎不起作用,我不知道为什么。

(用f替换空格或空格无效)

C:\crp\cnp>echo a a | sed s/\d32/f/
a a

注意-它似乎可能在 4.2 中工作,但我对 3.02 感兴趣,因为这是与 unxutils http://unxutils.sourceforge.net/ 捆绑的版本@

更新问题- 感谢paxdiablo的提示..关于gnu32win,我现在使用它而不是unxutils。它是最新的。我现在可以指定空格。还有 ghostdog 和 paxdiablo 的提示,我看到了双引号。我可以用 \d(因为使用 4.2)或空格来指定空格。 但是,我仍然无法删除新行

C:\crp>输入 f.f | sed -e "s/\r\n/f/g"

啊啊啊

b bb

c cc

C:\crp>输入 f.f | sed -e "s/\d013\d010/f/g"

啊啊啊

b bb

c cc

C:\crp>输入 f.f | sed -e "s/\x0D\x0A/f/g"

啊啊啊

b bb

c cc

注意:这个问题是从 2010 年开始的。现在是 2020 年。Gnuwin32 已过时(就像上次更新其 Gnuwin32 sed 是 2010 年,而 Sed 4.2.1 是从 2009 年开始的) , Unxutils 更是过时了。因此,截至 2020 年,Gnuwin32 已经过时了十年,而 Unxutils 更像是 20 年过时了。Cygwin 仍在保持最新状态,并且在撰写本文时是从 2017 年开始的 Sed v 4.4。

【问题讨论】:

    标签: windows command-line sed gnu command-prompt


    【解决方案1】:

    你为什么不只是使用空格字符本身而不是一些有趣的编码?如:

    sed -e 's/a/ /g'
    

    对于它的价值,您给出的命令在 4.2.1 中也无法工作,但是,如果您添加引号,它确实 工作。所以我建议你改成:

    sed -e 's/a/\d032/g'
    

    抱歉,我刚刚注意到您运行的是 Windows,因此您可能已经安装了 CygWin 或 GnuWin32(或同等版本)。

    引号在 Windows 下的工作方式不同,因此您应该尝试两件事。第一种是使用"而不是'引号:

    sed -e "s/a/ /g"
    

    否则,Windows 中的转义字符是^,所以这样的东西应该能够转义空格:

    sed -e s/a/^ /g
    

    顺便说一句,如果可能的话,我希望切换到 GnuWin32,它具有更新版本的 sed(例如)。根据您链接到的网页,UnxUtils 自 2003 年以来似乎没有进行过更新。您可以从here 获取单独的包。您正在寻找包含大量 UNIX 文本处理工具包的 coreutils

    但是,如果你被 UnxUtils 卡住了,我只会使用实际的空格而不是十进制代码,然后我会使用 tr 来删除新行:

    tr -d "\n"
    

    当然假设textutils 中的tr 可以处理该语法:-)

    【讨论】:

    • 您给出的命令在 3.02 中不起作用 C:\crp\cnp>echo a a | sed -e 's/a/ g' GIVES ERROR sed: -e expression #1, char 1: Unknown command: ``'''
    • 第二个命令,你说它在 4.2.1 中不起作用的 \d032 ,但如果你加上引号。我发现它在 4.2 中确实有效,而当我像你那样做并加上引号时,无论是 `(反引号)还是 '(单引号)。
    • @barlop,您似乎错过了 g 之前的 /。但无论如何,我刚刚注意到您使用的 Windows 在外壳方面略有不同,因此请查看更新。
    • “s/a/ /g”示例有效.. 虽然知道为什么 \d032 在 v3.02 中不起作用? (它在 v4.2 中,带或不带引号)。在 v3.02 中 C:\crp\cnp>echo a a | sed -e "s/a/\d032/g" GIVES d032 d032
    • 不知道,可能\d是3.02之后引入的。试试\x20 看看是否可行。
    【解决方案2】:

    我在 Win XP 上遇到了同样的问题,在尝试打印新行“\n”时双引号不起作用。 解决方案是使用来自http://unxutils.sourceforge.net/ 的新 UnxUpdates.zip 它适用于“\n”。

    Sed 版本状态: GNU sed 4.0.7 版

    【讨论】:

    • 我现在使用 gnuwin32。 unxutils 很方便“安装”(只是一个二进制文件的 zip),如果一个人懒惰但不值得! gnuwin32>unxutils。 unxutils 是旧的。 gnuwin32 还有更多。 gnuwin32 有 sed 4.2.1 所以,比 unxupdates.zip 更新还有一次我遇到 wget 与 unxutils 的问题,gnuwin32 作为 wget 的较新版本很好。在这里查看我的答案更多superuser.com/questions/168202/…
    【解决方案3】:

    在 windows 上,使用双引号

    sed "s/a/\d032/g" file
    

    或者只是

    sed "s/a/ /g" file
    

    【讨论】:

    • 对那些双引号非常正确!第二个效果很好。但是第一个(可能不需要引号)在 v3.02 中不起作用 C:\crp\cnp>echo a a | sed -e "s/a/\d032/g" 给出 d032 d032 (尽管在 4.2 中可以正常工作,带或不带引号)。似乎在 v3.02 中失败了
    最近更新 更多