【问题标题】:How to conditionally remove first line only with sed when it matches?如何在匹配时仅使用 sed 有条件地删除第一行?
【发布时间】:2015-01-26 07:18:48
【问题描述】:

我可以使用sed 来检查某些命令输出(到标准输出)的第一行,如果它与某个模式匹配则删除第一行?

比如说,命令的输出是这样的:

"AB"
"CD"
"E"
"F"

我希望它变成:

"CD"
"E"
"F"

但是当第一行是"GH"时,我不想删除该行。

我试过了,但它不起作用:

<some_command> |sed '1/<pattern>/d'

外壳告诉我:

sed: 0602-403 1/<pattern>/d is not a recognized function.

我只想用 sed 处理第一行,其他行不做修改。

这里的正确语法是什么?

【问题讨论】:

    标签: sed


    【解决方案1】:

    这可能对你有用:

    sed -e '1!b' -e '/GH/!d' file
    

    【讨论】:

    • 有效!我猜这里1 表示行号,但!b 是什么意思?另外,这两个表达式可以合并为一个(只使用一个-e)吗?
    • @QiangXu,是的1 是第一行,! 表示if notb 是一个break 命令,都表示if not line 1 bail out and continue with the next line。对于第一行,只有/GH/!d 表示if the line doesn't contain GH delete it。一些 sed 允许使用 ; 字符作为加入命令的一种方式,使用 BSDApple 您的成功可能会有所不同。
    • man sed 中,它只告诉我b[label] Branches to the : command bearing the label variable. If the label variable is empty, it branches to the end of the script. 手册没有提到b 作为中断命令。然而,它是这样工作的。我错过了什么?
    • 此解决方案仅适用于非常具体的 OP 示例。如果它与模式匹配,则首先跳过第一个并删除它。它不能与其他 sed 逻辑很好地结合。 0 , /pattern/ d 是正确的
    • @potong 对不起,我不明白你想说什么。也许我的评论不清楚。如果它不是第一行,则此 sed 脚本会跳过所有其他命令。否则,如果它与模式匹配,它将删除该行。如果您的脚本的唯一目的是完全做到这一点,则此方法有效。另一方面,1 { /pattern/ d } 让我们为其余的输入组合其他命令
    【解决方案2】:

    你想引用第一行,然后说删除:

    $ sed '1 d' file
    

    如果您知道要删除哪一行,则无需任何模式。

    使用模式,使用以下语法:

    $ sed '0,/pattern/ d' file
    

    【讨论】:

    • 不,我想删除第一行,前提是其中有某种模式。
    • 啊!是的,您需要一个命令,例如 p:sed /pattern1/p file——如果 s 命令有效,那么它应该是一个很好的匹配...我们可以看看实际的模式吗? (你能把它添加到你的帖子中吗?) 0,/pattern/ 地址很适合我!
    • 啊!您没有指定它是 AIX。是的...地址支持适用于某些 GNU 扩展。我不确定这是否适用于更标准的 sed。
    • 地址 0 在 POSIX 上不起作用。这是一个 GNU 功能。 POSIX sed 地址范围必须至少匹配 2 行,因为它在第一行打开一个标志并在第二行关闭它。见:gnu.org/software/sed/manual/html_node/Addresses.htmlgrymoire.com/Unix/Sed.html#toc-uh-29
    • @dosentmatter 1 { /pattern/ d } 也许?
    【解决方案3】:

    这就是你想要的:

    $ sed '1{/"GH"/!d}' file
    

    【讨论】:

    • 它不起作用,但是:sed: 0602-404 Function 1{/&lt;pattern&gt;/d} cannot be parsed. 我以"GH" 为例,并希望专注于我需要匹配的模式。这就是为什么我使用d,而不是!d
    • 那么你有一个后级 sed。尝试在{ 之后和} 之前添加换行符。
    • @jthill:仍然无法正常工作:sed: 0602-404 Function 1{\n/&lt;pattern&gt;/d\n} cannot be parsed. 我的 sed 来自 AIX 机器,而不是 GNU 机器,:(
    • 对于 BSD sed,您需要在括号中的命令后加一个分号:sed '1{/"GH"/!d;}' file 有效
    【解决方案4】:
    sed '1{/<pattern>/{/GH/!d}}' input
    

    您的表达式中的错误可以这样修复:

    sed '1{/<pattern>/d}' input
    

    【讨论】:

      猜你喜欢
      • 2018-11-24
      • 2015-05-07
      • 1970-01-01
      • 2012-01-09
      • 1970-01-01
      • 1970-01-01
      • 2012-04-15
      • 1970-01-01
      • 2014-07-05
      相关资源
      最近更新 更多