SED:在最后一行后插入文本?

98 sed

这个sed 命令在文件的开头插入一个标签:

sed -i "1s/^/<?php /" file
Run Code Online (Sandbox Code Playgroud)

如何使用 sed 在每个文件的末尾插入一些内容?

小智 131

最简单的方法是:

sed -i -e '$aTEXTTOEND'文件名

这个怎么运作

$匹配最后一行(它是一个普通sed地址;4aTEXTTOEND将在第四行之后插入),a是 append 命令,TEXTTOEND是要追加的内容,filenameTEXTTOEND将要插入的文件

  • 对于 MacOS sed:`-e $'$a\\\n\\'` (3认同)
  • 此命令不支持新文件。(零字节) (2认同)
  • 不在 macos 上工作。甚至 Jorge Bucaran 都没有评论:sed: 1: "$a\NEWLINE\\ ": 命令末尾 \ 后的额外字符 (2认同)
  • 在 debian 9 中,它添加了一个新行,而不是在最后一行的末尾添加。 (2认同)

小智 39

sed在这种情况下不需要使用。怎么样

echo "<?php" >> file
Run Code Online (Sandbox Code Playgroud)

  • 我不喜欢猜测。每次我尝试,我都错了。 (4认同)
  • 接受的答案更有用的另一个原因是在前面加上 `sudo` 的情况下,这会导致此变体失败,因为 `echo` 是一个内置的 shell 命令,而不是在 `$PATH` 中找到的可执行文件 (4认同)
  • 确实如此,但是您可以猜到 OP 的用例是用“`&lt;php `”和“`&gt;`”将文件括起来,并一次性引用选定的内容,所以他可能*真的*确实想要一个`sed `片段。 (2认同)
  • 此外,如果你会这样做并且不想要换行符,请使用 echo -n (2认同)

Vin*_*vic 28

假设你想把结尾的 php 标签放到文件中,然后

sed -i '$s/$/\n?>/' file
Run Code Online (Sandbox Code Playgroud)

应该做的伎俩


小智 5

使用 sed 'append (a)' 命令。例如,要在文件末尾附加两行:

sed -i -e '$a\
foo1 bar1\
foo2 bar2' file
Run Code Online (Sandbox Code Playgroud)


小智 5

相当于你的sed -i '1s/^/<start</' file将是:

sed -i '$s/$/>end>/' file
Run Code Online (Sandbox Code Playgroud)

这会将文本添加>end>到文件的最后一行(不带换行符)。当然,在这种情况下(也如您的示例中所示),文件需要至少包含一行(非空)。

使用双引号(如所选答案中所示)并不是一个好主意,因为 shell 将尝试处理$字符串中的每个双引号。该命令将转换为:

sed -i "\$s/\$/>end>/" file
Run Code Online (Sandbox Code Playgroud)

使用a(append, end) 或i(insert, start) 也会插入换行符,在 BSD 和 GNU 中需要不同的调用,并且仍然需要一个非空文件。

对于 GNU:

$ sed '1i<start<' file
$ sed '$a>end>' file
Run Code Online (Sandbox Code Playgroud)

对于BSD:

$ sed '1i\
<start<' file
$ sed '$a\
>end>' file
Run Code Online (Sandbox Code Playgroud)

或者,在允许的 shell 中(C 字符串):

$ sed $'1i\\\n<start<' file
$ sed $'$a\\\n>end>' file
Run Code Online (Sandbox Code Playgroud)

当然,没有什么比以下更简单的了:

echo '>end>' >> file
Run Code Online (Sandbox Code Playgroud)

它也适用于空文件。