【问题标题】:Why sed is replacing all my file contents?为什么 sed 会替换我所有的文件内容?
【发布时间】:2017-08-11 01:59:56
【问题描述】:

我试图在文件开头插入一个 /file/path 作为字符串,并让 sed 返回代码 100,但它正在替换我所有的文件内容:

printf "Message\nMessage\nMessage\n" > test.tex;
sed -i "\@^@{ 1s@^@% Message\n@; q100}" test.tex;
cat test.tex;

输出:

% Message
Message

如果我尝试将1s 放在开头:

sed -i "\1s@^@{ 1s@^@% Message\n@; q100}" test.tex

它抛出错误:

sed: -e expression #1, char 32: unexpected `}'

参考资料:

  1. Return code of sed for no match
  2. How can I pass correctly the parameter `q` with value 100 to my sed expression?

更新

我只是注意到返回码为 100 没有任何意义,所以我可以这样做

sed '1s@^@% Message\n@'

但出于好奇,这可能吗?

更新 2

正确的输出是:

% Message
Message
Message
Message

即保留我添加到文件中的最初3个文件Message

【问题讨论】:

    标签: bash sed


    【解决方案1】:

    如果没有告诉sed 做任何其他事情,sed 的默认行为是在运行为其指定的任何命令后回显每一行。因此,当您执行sed -i ";" test.tex 时,它将在第 1 行运行;,回显(未更改的)行,然后移至第 2 行并重复该过程。但是,如果您执行sed -i "q" test.tex,它会对第 1 行进行(完全没有)更改,回显它,然后运行q 命令并立即退出,而没有机会回显所有其他行。

    这就是您的代码中发生的情况。为避免该问题,您应该指定q 命令将执行的行范围。 $ 是最后一行,所以:

    sed -i "\@^@{ 1s@^@% Message\n@;}; $ {q100}" test.tex;
    

    【讨论】:

    • sed -i "\@^@{ 1s@^@% Message\n@ ;$ q100}" 可能也可以;很好的解释+1
    【解决方案2】:

    如果你只想在文件开头插入一行,你可以试试这个

    sed -i -e '1i\% Message' -e '$q100' test.tex
    

    以下命令指示 sed 在第一行之前插入“%Message”。

    -e '1i\% Message'
    

    以下命令指示 sed 在打印最后一行后退出并返回代码 100。

    -e '$q100'
    

    【讨论】:

      猜你喜欢
      • 2013-03-28
      • 2017-07-27
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      • 1970-01-01
      • 2023-01-03
      • 2018-07-21
      相关资源
      最近更新 更多