我正在尝试在文件的开头插入一个/ 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 `}'
参考文献:
我刚注意到返回代码为100没有任何意义,所以我可以做到
sed '1s@^@% Message\n@'
但是出于好奇,这可能吗?
正确的输出是:
% Message
Message
Message
Message
也就是说,保留我添加到文件中的初始3个文件Message
。
答案 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'