我一直在寻找sed命令,以在特定行中将文本添加到文件中。
这可以在第1行之后添加文本:

sed '1 a\


但是我想要在第1行之前添加它。它应该是:

sed '0 a\


,但我收到此错误:invalid usage of line address 0

有任何建议吗?

评论

stackoverflow.com/questions/15157659 / ...

#1 楼

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

问题作者的更新:
要使用GNU sed-I就地编辑文件必须添加
-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上的实现)需要-i标志的参数(使用-i ''可获得与GNU相同的效果sed)。
对于根本不支持sed-i实现,请在不使用此选项的情况下运行,但将输出重定向到新文件。然后将旧文件替换为新创建的文件。

评论


没有-i选项,该功能将不起作用。我会在接受之前更新您的答案。

– Manolo
13年8月8日在12:07

谢谢。您正在使用什么操作系统?原始解决方案适用于OpenSuse 9。

–嫌疑犯
13年8月8日在12:22

有趣!我在Lubuntu 13.10上使用sed'1 i \此文本已输入到现有第一行的上方'文件对我有用。

–user15760
13年8月8日13:47

在这里,使用sed(GNU sed)4.2.2只是sed'1 i text to insert'-i文件就像一个魅力。谢谢

–吨
16年2月15日在14:06

在空文件上不起作用。

– rudimeier
16-09-28在20:32

#2 楼

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

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


评论


请让我知道以下原因为何

– Ankit Shah
17年1月9日14:58

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

–рüффп
18年4月12日在10:46

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

–arcee123
19年8月22日在13:47

这是很好的解决方案!它可以在Makefile和MacOS中很好地工作。

–zx1986
20年6月18日在23:33

#3 楼

您可以使用POSIX工具ex

ex a.txt <<eof
1 insert
Sunday
.
xit
eof


https://pubs.opengroup.org/onlinepubs/9699919799/utilities/ex.html

#4 楼

使用GNU awk> = 4.1:

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


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

评论


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

–vossad01
18年7月8日在14:15



#5 楼

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

sed '1 i\
your_text' your_file


此处文档也可以帮助您:

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


#6 楼

sed  -i '1i new_text' file_name


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

评论


问题与-i开关无关。

–don_crissti
16年3月14日在20:30

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

– G-Man说“恢复莫妮卡”
16-3-14在22:51

@ G-Man-有人可能会说cas所使用的模板远非理想,但实际上,这几乎就像是完全一样的...区别在于间距和该模板没有反斜杠。就我而言,它们在技术上是相同的(因为它们都是特定于gnu sed的,并且碰巧gnu sed会接受i而没有反斜杠)。如果其他人认为这值得一个单独的答案+赞成……哦。

–don_crissti
16 Mar 15 '16 at 0:41

#7 楼

您尝试执行的0a命令在exvi的前身)中有效:

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


printf命令本身输出: />
0a表示在第0行之后(即第一行之前)追加。

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

一行上的.本身会终止“ append”命令。

x使Ex将更改保存到文件中并退出。

#8 楼

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

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


在大多数shell中都可以使用并且可移植到多个sed版本,前提是该文件至少包含一个有效行。
如果GNU sed可用,则可以使用以下代码:

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


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

如果接受$'…'语法的shell是在使用中,您可以直接插入换行符,以便sed看到换行符已经存在:

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


哪个版本适用于更多sed版本。

如果文件没有行(即:它为空),则为:

$ echo "new_text" > file_name


评论


如果文件中没有行怎么办?

–只是一个学习者
20 Jan 9 '20 at 7:21

@Justalearner问题的标题要求:在文件的第一行之前插入文本,因此,第一行必须已经存在。对于选择的答案,这也是一个问题。

–艾萨克
20年1月13日在19:04

惊人的答案@以撒。从字面上看,这肯定是唯一可行的解​​决方案。我需要在第一行之前添加“模式”:无需添加任何新行。您的解决方案工作-> sed -i'1s / ^ /“ schema”:/'o

–nitinr708
20年4月1日在19:13

@ nitinr708谢谢!乐于提供帮助。

–艾萨克
20年4月1日在23:15

#9 楼

我在使用BSD sed(MacOS)和从变量中插入文本时遇到问题,所以这是我的方法:

headers=a,b,c
sed -i '' -e "1{x;s/^.*/$headers/p;x;} some_file"


解释



1{...}这仅影响第一行

x将当前行替换为保留空间(当前为空)

s/../../p替换(现在为空行)与预期的文本(这避免了换行问题)并输出(这样第一行将被打印)

x再次交换,检索保留的文件第一行空间进入图案空间


#10 楼

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

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


评论


不知道您在说什么...只有一个sed答案使用替换,但不能替换现有行。

–don_crissti
18年11月15日在18:06

#11 楼

如果有人感兴趣,我的问题是将相同的标题行插入几个文件中。感谢提出的解决方案,我提出了以下解决方案:

sed -i 1i\ $(cat header_line) data.csv


其中header_line是包含所需第一行的文件,

#12 楼

在没有回车符或换行符的第一行之前添加文本hello到文件myfile

sed -i '1s/^/hello /' myfile


这也不会在终端上输出整个文件。

#13 楼

与Ankit Shah的答案类似:
(echo "some text" && cat filename) > /tmp/filename && cat /tmp/filename > filename

使用这么长的命令并不方便,所以我创建了一个简单的bash函数(在.bashrc或其他可能的地方),如下所示:
echo0 () {
  (echo ${@:2} && cat ) > /tmp/
  cat /tmp/ > 
}
#  is your-file-name, ${@:2} are contents after "your-file-name".
# How to use:
#   > echo0 myfile hellow world etc.
#   > head myfile
#     hellow world etc.
#     ...


#14 楼


sed可以在第一个和最后一个之前和之后插入(多次)

我认为,搜索过如何在文件的开头/结尾插入文本的任何人也可能还需要知道如何做其他事情。

cal |                            \
  gsed -E                        \
       -e     '1i\{'             \
       -e     '1i\  "lines": ['  \
       -e 's/(.*)/    "",/'    \
       -e '$s/,$//'              \
       -e     '$a\  ]'           \
       -e     '$a\}'


解释

这是通过管道传输到gnu- calsed输出(在macOS上称为gsed通过brew.sh安装),并使用扩展的RegEx(-E)和6个“脚本”(-e),并使用\换行以提高可读性。


脚本1和2使用1i\来表示“在第1行,插入”。
脚本5和6使用$a\到“在行,附加”。


我垂直对齐文本输出以使代码表示结果中预期的结果。


脚本3和4进行替换


脚本4仅适用于“行”,因为$放在s/之前。



结果将转换为mmand输出到有效JSON。

输出

{
  "lines": [
    "    October 2019      ",
    "Su Mo Tu We Th Fr Sa  ",
    "       1  2  3  4  5  ",
    " 6  7  8  9 10 11 12  ",
    "13 14 15 16 17 18 19  ",
    "20 21 22 23 24 25 26  ",
    "27 28 29 30 31        ",
    "                      "
  ]
}


评论


尽管我还没有对您的问题进行表决,但是请注意,我们已经有几个答案,其中包括一个被接受的答案,可以证明预期的结果。

– Jeff Schaller♦
19-10-22在12:12

@JeffSchaller Stack Exchange社区不是论坛。其目的不仅限于帮助OP畅通无阻。目标是为全球知识库提供很多选择,供搜索者在寻找答案时可以偶然发现。我将答案命名为“答案”的原因是为了帮助用户甚至在单击Google结果之前就可以识别该答案的实用程序。

–布鲁诺·布鲁诺斯基(Bruno Bronosky)
19-10-22在16:09

我的意思是您的答案没有为未来的这个问题的读者提供任何新的选择(答案)。我们已经有四个答案,它们使用1i的变体在第一行之前插入文本。有这个问题的人将不得不从您的答案中提取他们需要的部分,以解决他们的问题。问题是免费的,因此,我邀请您提出并回答自己的问题,以便提供您的特定答案。

– Jeff Schaller♦
19-10-22在16:19