sed insert line命令OSX

gda*_*tor 11 macos bash sed insert

我正在尝试使用sed将文本插入文件的第三行,我在其他论坛上找到的语法是:

sed -i '' "3i\ text to insert" file
Run Code Online (Sandbox Code Playgroud)

但是,当我使用它时,我收到一个错误:

sed: 1: "3i\ text to insert": extra characters after \ at the end of i command
Run Code Online (Sandbox Code Playgroud)

我似乎无法弄清楚导致问题的原因.我正在使用OSX,这就是为什么我有一个空的''作为我的扩展.

谢谢!

Tom*_*ech 30

您应该在以下后面直接添加换行符\:

sed '3i\
text to insert' file
Run Code Online (Sandbox Code Playgroud)

这实际上是POSIX规范定义的行为.GNU sed允许您指定要在同一行上插入的文本的事实是扩展.


如果由于某种原因你需要在sed命令周围使用双引号,那么你必须在第一行末尾转义反斜杠:

sed "3i\\
text to insert" file
Run Code Online (Sandbox Code Playgroud)

这是因为shell首先处理双引号字符串,\然后删除换行符:

$ echo "abc\
def"
abcdef
Run Code Online (Sandbox Code Playgroud)

  • 我想给出一个额外的+1来指出'在'3i'位之后'插入的文本'是一个GNU扩展名(但我只能给它们中的一个). (3认同)
  • @JonathanLeffler 我会代表你给他另外一个+1 :-) (3认同)

anu*_*ava 14

在OSX上,您可以使用:

sed -i.bak '3i\
text to insert
' file
Run Code Online (Sandbox Code Playgroud)


Joe*_*eer 12

OSX 的单行代码采用 ANSI-C 引用:

sed -i '' '3i\'$'\n''text to insert' file
Run Code Online (Sandbox Code Playgroud)

改编自/sf/answers/1700989181/


Vla*_*Aus 6

以下是如何用一行语法做到这一点

sed -i '' -e "2s/^//p; 2s/^.*/text to insert/" file
Run Code Online (Sandbox Code Playgroud)
  • 重复第二行: 2s/^//p;

  • 用您的文本替换新行: 2s/^.*/text to insert/