为什么sed正在替换我的所有文件内容?

时间:2017-08-09 00:13:13

标签: bash sed

我正在尝试在文件的开头插入一个/ 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?
  3. 更新

    我刚注意到返回代码为100没有任何意义,所以我可以做到

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

    但是出于好奇,这可能吗?

    更新2

    正确的输出是:

    % Message
    Message
    Message
    Message
    

    也就是说,保留我添加到文件中的初始3个文件Message

2 个答案:

答案 0 :(得分:3)

sed的默认行为如果没有被告知要做任何其他操作,则在运行已为其指定的任何命令后回显每一行。因此,当您执行sed -i ";" test.tex时,它将在第1行运行;,回显(未更改)行,然后转到第2行并重复此过程。但是如果你做sed -i "q" test.tex,它会使(完全没有)改变到第1行,回应它,然后运行q命令并立即退出,而没有机会回显所有其他行。< / p>

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

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

答案 1 :(得分:1)

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

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

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

-e '1i\% Message'

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

-e '$q100'