如何使用命令行在文本文件顶部插入一行?


25

我想在现有文件的顶部插入文本。我该如何做到这一点。我试过echotee,但没有成功。

我试图sources.list从终端在文件顶部插入回购行。

注意

我需要一个单行快速解决方案,因为我已经知道了另一个答案的方法


1
tee在文件的底部添加了一行,例如echo "deb http://extras.ubuntu.com/ubuntu precise main" | sudo tee -a /etc/apt/sources.list-您还需要在tee之前使用sudo以获得管理员权限。但是到底为什么要在sources.list的最顶部添加一些内容?
Savvas Radevic

2
@medigeek:在OP的问题历史记录中的某个地方,您会找到有关从CD-repo安装/更新的信息...我怀疑这可能是原因...
ish 2012年

谢谢@izx,您的假设是正确的。我很安静。您还能回答这个问题吗?那是关于使用软件中心从本地存储库进行安装,以及将我的本地存储库设置为最高优先级而不将其放置在顶部。再次感谢。
安瓦尔2012年

1
@izx,这是有关为本地存储库设置最高优先级的链接。如果您也可以检查有关软件中心的问题,我将非常高兴。再次感谢您的第一条评论。很高兴
安瓦尔

1
@medigeek,您可以看到此问题以解释这种罕见的问题。
安瓦尔

Answers:


38

其实很容易sed

  • sed -i -e '1iHere is my new top line\' filename

  • 1i告诉sed插入文件第1行后面的文本;不要忘了\换行符的末尾,以便将现有的第1行移到第2行。


1
谢谢。仅作说明:如果要替换,而不是在中插入use s代替i 1i
Anwar

3
遗憾的是,这对于空文件失败(它没有第一行,因此sed永远不会插入)。
蒂诺2014年

@Tino对于空文件,您可以使用echo "Text Here" >> Filename
Flotolk

在MacOS 10上不起作用
克里希纳

7

在地方使用脚本编辑一般是棘手的,但你可以使用echocatmv

echo "fred" > fred.txt
cat fred.txt t.txt >new.t.txt
# now the file new.t.txt has a new line "fred" at the top of it
cat new.t.txt
# can now do the rename/move
mv new.t.txt t.txt

但是,如果您正在使用sources.list,则需要添加一些验证和项目符号校对以检测错误等,因为您确实不想丢失它。但这是一个单独的问题:-)


我已经可以了 我需要izx给出的一线解决方案。但是感谢您的回答。
安瓦尔2012年

1
@AnwarShah-抱歉!您应该在问题中这么说:-)
肖恩(Sean)

我承认,+ 1为您的答案,也为评论。(我不能再给更多了)
Anwar

6
./prepend.sh "myString" ./myfile.txt

知道这prepend我的自定义外壳程序

#!/bin/sh
#add Line at the top of File
# @author Abdennour TOUMI
if [ -e $2 ]; then
    sed -i -e '1i$1\' $2
fi

也可以使用relatif路径或绝对路径,它应该可以正常工作:

./prepend.sh "my New Line at Top"  ../Documents/myfile.txt

更新:

如果要为此使用永久脚本,请打开,nano /etc/bash.bashrc然后在文件末尾添加此功能:

function prepend(){
# @author Abdennour TOUMI
if [ -e $2 ]; then
    sed -i -e '1i$1\' $2
fi

}

重新打开终端并享受:

prepend "another line at top" /path/to/my/file.txt

5

为何不使用真正的文本编辑器呢?ed是标准的文本编辑器。

ed -s filename <<< $'1i\nFIRST LINE HERE\n.\nwq'

或者,如果您希望命令更具可读性:

ed -s filename < <(printf '%s\n' 1i "FIRST LINE" . wq)
  • 1:转到第一行
  • i:插入模式
  • 您想插入的东西...
  • .:停止插入,返回正常模式
  • wq:写下并退出,谢谢,再见。

如何FIRST LINE与此一起使用shell变量替换(在中)?
vp_arth

1
@vp_arth如果您的内容是可变的first_line,则:ed -s filename < <(printf '%s\n' 1i "$first_line" . wq)。确保变量不会扩展为单个点,并且不包含任何换行符(因此,如果来自用户输入,请对其进行清理)。
gniourf_gniourf 2015年

3

总有awk选择。string用您的内容替换变量。但是,这不是就地更改。就个人而言,我倾向于不就地进行更改。这绝对是个人喜好。两件事,-v在awk中表示一个变量,在n这里变量用于有效地匹配行号NR == 1。您可以通过更改nand 的值以多种方式使用它s

string="My New first line"; awk -v n=1 -v s="$string" 'NR == n {print s} {print}'     file.source > file.target

例:

% cat file.source                                                                                                                                      

First Line
Second Line
Third Line

% string="Updated First Line"; awk -v n=1 -v s="$string" 'NR == n {print s} {print}' file.source > file.target; cat ./file.target                      !698

Updated First Line
First Line
Second Line
Third Line

2

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

ex -sc '1i|hello world' -cx sources.list
  1. 1 选择第一行

  2. i 插入新行

  3. x 保存并关闭


比到目前为止提供的其他解决方案简单得多。谢谢。
Pothi Kalimuthu
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.