如何在文件的第一行之前插入文本?


Answers:


101

使用sed的insert(i)选项可将文本插入到前一行。

sed '1 i\

问题作者的更新:

为了使其在位编辑文件-使用GNU- sed我必须添加以下 -i选项:

sed -i '1 i\anything' file

也语法

sed  -i '1i text' filename

对于非GNU sed

您需要在反斜杠1i\之后和之后立即按回车键first_line_text

sed -i '1i\
first_line_text
'

还要注意,某些非GNU的sed实现(例如,在macOS上的实现)需要-iflag提供一个参数(用于-i ''获得与GNU相同的效果sed)。


1
没有-i选择就行不通。我会在接受之前更新您的答案。
Manolo

1
谢谢。您正在使用什么操作系统?9.在openSUSE原液工作
suspectus

1
有趣!我在Lubuntu 13.10上sed '1 i\this text is entered above the existing first line' file为我工作。

2
在这里,用sed (GNU sed) 4.2.2sed '1 i text to insert' -i file工作就像一个魅力。谢谢

1
@FeRD请在awk下面查看我的不良排名答案。这应该工作。
rudimeier

18

回声用于获取文本。Cat文件名-在控制台中打印文件,然后>使用文件名将其发送到另一个文件filename1,然后将filename1移至f​​ilename,以将文本插入到所需文件的第一行。

  (echo "some text" && cat filename) > filename1 && mv filename1 filename

7
请让我知道为什么以下内容遭到拒绝
Ankit Shah

1
也许是因为OP提到sed。我认为那不应该被否决。该解决方案甚至是最适合我需求的解决方案,然后投票支持。
рüффп

我投票了。为我在ksh上工作。
arcee123

15

您可以在Ex模式下使用Vim:

ex -sc '1i|ALFA BRAVO' -cx file
  1. 1 选择第一行

  2. i 插入文字和换行符

  3. x 保存并关闭


7

您想在第一行之前插入文本,而不是在其后附加文本,因此请使用

sed '1 i\
your_text' your_file

这里的文档也可以帮助您:

cat /dev/stdin your_file <<EOI
Your text
goes here
EOI

6

使用GNU awk> = 4.1:

awk -i inplace 'BEGINFILE{print "first line"}{print}' foo.sh

与所有sed答案相反,这也适用于空文件。


inplace是一个图书馆,不幸的是,它出现在所有awk发行版本中。我收到“ awk:致命:无法打开源文件' GNU Awk 4.2.1, API: 2.0 (GNU MPFR 4.0.1, GNU MP 6.1.2)
inplace

6
sed  -i '1i new_text' file_name

如果不指定该-i选项,则不会显示任何错误,并在标准终端上显示输出,但不会在文件中插入文本。


问题不在于-i开关。
don_crissti

您如何看待?这对这个问题的答案。是的,它接受的答案相似,但不完全相同。
G-Man

@ G-人-一个可能会认为由中科院所使用的模板是很不理想不过说真的,这是类似像在几乎相同的 ......区别在于间距和这个人有没有反斜杠的事实。就我而言,它们在技术上是相同的(因为它们都是gnu sed特定的,只是碰巧gnu sed会接受i没有反斜杠的)。如果其他人认为这值得一个单独的答案+赞成...哦,对了。
don_crissti

1

0a您尝试的命令确实可以在以下命令ex中运行vi

printf '%s\n' 0a 'Anything you want to add' . x | ex file.txt

printf命令本身输出:

0a
Anything you want to add
.
x

0a装置追加第0行之后(即,第一行之前)。

下一行或多行是要添加的文字文本。

.一行由本身终止“追加”命令。

x原因防爆将更改保存到文件并退出。


1

令我惊讶的是,在这个老问题中,没有人显示出最常见的(在这种情况下非常简单)sed命令:

$ sed  -i '1s/^/new_text\
/' file_name

它适用于大多数shell,并且可以移植到多个sed版本。
如果GNU sed可用,则可以使用以下命令:

$ sed -i '1s/^/new_text\n' file_name

不同之处在于GNU sed允许在\n换行符中使用a ,而其他人则需要在换行符前加反斜杠(无论如何在GNU sed中也可以使用)。

如果$'…'正在使用接受语法的外壳,则可以直接插入换行符,因此sed会看到换行符已经存在:

$ sed -i $'1s/^/new_text\\\n/' file_name

适用于sed版本。


-1

不幸的是,上述所有答案(大多数是针对sed)都无法解决,因为它们都替代了第一行。我在Ubuntu 16.04 LTS机器上。这是我的解决方法GNU Awk 4.0.2

awk '{if(NR==1){$0="NEW_FIRST_LINE"$0; print $0} ;if(NR!=1){print $0}}' file_name

1
不知道您在说什么...只有一个sed答案使用替代词,但不能替代现有的词句。
don_crissti
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.