【问题标题】:How can you both delete a line and append another with a one-liner sed command?您如何使用单行 sed 命令既删除一行又追加另一行?
【发布时间】:2013-03-26 13:39:33
【问题描述】:

我知道如何使用 sed 进行删除和替换,但是我在使用 append 命令时遇到了问题。现在,我正在这样做:

sed -i '' -e '/optima/d' file

这会从文件中删除正确的行(假设它存在)。但是,我还想在文件末尾添加另一行,我不能在第二行使用“echo something >> file”。我什至不能使用第二个 sed 调用。

这样做的语法是什么?

【问题讨论】:

标签: scripting sed


【解决方案1】:

这里更好的方法是打印除要删除的行之外的所有内容,然后附加最后一行。即使您要删除的行是最后一行,这仍然有效,而 Kent 的方法不适用于这种情况。

sed -i -n -e '/optima/!p' -e '$asomething' file

例子:

$ seq 5 | sed -n -e '/5/!p' -e '$asomething'
1
2
4
something

【讨论】:

    【解决方案2】:

    我还想在文件末尾添加另一行...

    试试这个:

    sed -i ''  '/optima/d; $a \something' file
    

    示例:

    kent$ seq 20|sed '/3/d; $a \yourText'
    1
    2
    4
    5
    6
    7
    8
    9
    10
    11
    12
    14
    15
    16
    17
    18
    19
    20
    yourText
    

    【讨论】:

    • 当我尝试该语句时,我收到以下错误:sed: 1: "/optima/d; $a \something and on a second line " : 在命令末尾的 \ 之后的额外字符 .
    • 是的,带单引号。我什至小心翼翼地使用正确的空格。如果这很重要,它在 OS X w/bash 上,但我无法想象他们有一个搞砸的 sed 实现。
    • 我没有使用 os x 的经验。您可以尝试在a$... 或-e 之间插入一个空格,但我不知道它是否有帮助。不熟悉 bsd sed ... :( 这在 gnu sed 下工作
    • 当您删除最后一行时,这在极端情况下不起作用。例如,尝试seq 20|sed '/20/d; $a \yourText'。有什么解决方法吗?
    • 对于 OS X,您必须跳过 $a\yourText 之间的行 => seq 20|sed '/3/d; $a\[SKIP THE LINE] yourText'
    猜你喜欢
    • 2012-04-02
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    • 2021-12-11
    • 2015-10-14
    • 2011-02-03
    • 1970-01-01
    相关资源
    最近更新 更多