【问题标题】:What actually the meaning of "-n" in sed?sed中“-n”的实际含义是什么?
【发布时间】:2011-05-04 16:17:50
【问题描述】:

根据http://linux.about.com/od/commands/l/blcmdl1_sed.htm

禁止自动打印图案 空间

我在有或没有-n 的情况下进行了测试,sed 会产生相同的结果

我不明白空格是什么意思。

【问题讨论】:

    标签: regex unix sed space


    【解决方案1】:

    Sed 有两个地方可以存储文本:模式空间和保持空间。模式空间是每行被 sed 命令处理的地方;保留空间是放置一些您以后可能要使用的文本的辅助位置。您可能只会使用模式空间。

    在 sed 处理一行之前,它被放入模式空间。然后,sed 将所有命令(例如 s///)应用到 de 模式空间,并且默认情况下,从模式空间打印结果文本。假设我们有一个文件myfile,其中包含如下行:

    The quick brown fox jumps over the lazy dog.
    

    我们运行以下命令:

    sed 's/fox/coati/;s/dog/dingo/' myfile
    

    Sed 将为文件的每一行应用s/fox/coati/ 然后s/dog/dingo/ - 在这种情况下,我们在上面显示的唯一一个。当它发生时,它会将该行放入模式空间中,其中将有以下内容:

    The quick brown fox jumps over the lazy dog.
    

    然后,sed 将运行第一个命令。 sed 运行命令s/fox/coati/ 后,模式空间的内容为:

    The quick brown coati jumps over the lazy dog.
    

    然后 sed 将应用第二个命令,即s/dog/dingo/。之后,模式空间的内容将是:

    The quick brown coati jumps over the lazy dingo.
    

    请注意,这只发生在内存中 - 现在没有打印任何内容。

    在所有命令都应用到当前行之后,默认情况下,sed 将获取模式空间的内容并将其打印到标准输出。但是,当您将-n 作为 sed 的选项时,您要求 sed 不要执行这最后一步除非明确要求。所以,如果你运行

    sed -n 's/fox/coati/;s/dog/dingo/' myfile
    

    不会打印任何内容。

    但是您如何明确要求 sed 打印模式空间?好吧,您可以使用p 命令。当 sed 发现这个命令时,它会立即打印模式空间的内容。例如,在下面的命令中,我们要求 sed 在第一条命令之后打印模式空间的内容:

    sed -n 's/fox/coat/;p;s/dog/dingo/' myfile
    

    结果是

    $ sed -n 's/fox/coati/;p;s/dog/dingo/' myfile 
    The quick brown coati jumps over the lazy dog.
    

    请注意,只有fox 被替换。这是因为在打印模式空间之前没有执行第二个命令。如果我们想在两个命令之后打印模式空间,我们只需将p 放在第二个命令之后:

    sed -n 's/fox/coati/;s/dog/dingo/;p' myfile
    

    如果您使用s/// 命令,另一种选择是将p 标志传递给s///

    sed -n 's/fox/coati/;s/dog/dingo/p' myfile 
    

    在这种情况下,只有在标记的替换被执行时才会打印该行。它可能非常有用!

    【讨论】:

    • 对于其他人:sed -n 's/fox/coati/;s/dog/dingo/;p' myfilesed -n 's/fox/coati/;s/dog/dingo/p' myfile 有所作为。
    • @Rick 是的! 当且仅当该行中的dogdingo 替换时,该行才会被打印。例如,如果foxcoati, 替换,则不会打印该行。
    【解决方案2】:

    试试 sed 什么都不做:

    sed '' file
    

    sed -n '' file
    

    第一个将打印整个文件,但第二个不会打印任何内容。

    【讨论】:

    • 旁白:如果您使用 -i(--in-place :就地编辑;静默编辑),请勿将其与 -n { -in | -ni | -i -n | -n -i },因为你会得到意想不到的结果,包括空(0字节)的输出文件。
    • @VictoriaStuart 我刚刚浪费了 2 个小时的时间来调试 sed,同时传递了 -n-i。我得到一个空文件,但不明白为什么。我刚停下来,因为我看到了你的评论,谢谢!
    【解决方案3】:

    这会将 sed 置于安静模式,其中 sed 将抑制所有输出,除非p 命令明确声明:

       -n 
       --quiet 
       --silent
              By default, sed will print out the pattern space at
              the  end  of  each cycle through the script.  These
              options disable this automatic  printing,  and  sed
              will  only  produce  output when explicitly told to
              via the p command.
    

    如果您想使用 sed 来模拟 grep 的操作,例如:

    $echo -e "a\nb\nc" | sed -n '/[ab]/ p'
    a
    b
    

    没有-n,你会得到一个 c 的出现(以及两个 a 和 b 的出现)

    【讨论】:

      【解决方案4】:
      $ echo "a b c d" | sed "s/a/苹果/"
      苹果b c d

      隐式打印模式空间。

      $ echo "a b c d" | sed -n "s/a/apple/"

      没有输出。

      $ echo "a b c d" | sed -n "s/a/苹果/p"
      苹果b c d

      显式打印模式空间。

      【讨论】:

        猜你喜欢
        • 2023-04-01
        • 2021-10-07
        • 2013-01-04
        • 2015-02-21
        • 1970-01-01
        • 2013-06-13
        • 2015-01-20
        • 2016-09-29
        • 2013-08-03
        相关资源
        最近更新 更多