如何从命令行写入文件的第二行?


Answers:


20
awk 'NR==1{print; print "new line"} NR!=1'

12
短一点:awk 'NR==2 {print "new line"} 1'
glenn jackman 2012年

@glennjackman:您的版本在我的系统上不起作用,但是答案可以。具体来说,对于您的,第2行是重复的,并且新行将插入两者之间(如第3行)。
Nikana Reklawyks 2014年

有没有办法在第二行开始写并覆盖所有后续行?
CMCDragonkai 2015年

@CMCDragonkai我不太确定您要的是什么。只需打印指定文件的第一行并设置第二行?第一行,然后是文件的内容?第一个文件的第一行,然后是第二个文件中的第一行中其余各行的第二行?您可能想问一个新问题,其中包含对所需内容的非常具体的描述以及相对简短但完整的示例。
凯文

16

对于您的特定情况,这应该更简单:

sed '1 { P ; x }' your-file

说明:在第1行,执行以下操作

  1. P RINT行
  2. E x用保留空间更改模式空间(基本上清空缓冲区)

然后,在循环中再次打印该行(现在为空)。


如果您想添加新行而不是新行字符(据我最初的理解),则只需使用sed的命令a\(追加):

sed '1 a\
appended line' your-file

甚至

sed '1 aappended line' your-file

appended line在第1行之后附加“ ”。


1
sed -i '1 a\\' file只换行。
forcefsck 2012年

1
@forcefsck是的,第二个'1 aapended line'例子是它的唯一缺点是它是GNUism 。
安格斯2012年

8

我想sed方法是:

sed '2 i whatever_line_of_text_you_wanted_to_INSERT' filename.txt

这将使文本进入文件的第二行,然后文件中实际的第二行将变为第三行。

请注意,如果必须使用append模式,则必须使用第一行,因为追加将在指定的行号之后进行。

sed '1 a whatever_line_of_text_you_wanted_to_INSERT' filename.txt



2

这可能对您有用:

sed 1G file

如果要something在换行符后插入:

sed '1{G;s/$/something/}' file

或者,如果sed处理\n

sed '1s/$/\nsomething/' file

当然a更容易了:

sed '1a something' file

对不起,它是做什么的?
Nikhil Mulley 2012年

它在第1行之后插入换行符
potong 2012年

1
或者更确切地说在第一行后面添加一个换行符\n
potong 2012年

1

我通常ed为此使用:

(echo 1a; echo 'Line to insert'; echo .; echo w) | ed - filename

类似于sed解决方案,但没有换行符的混乱。


2
您可以保留一些内容echo,尤其是在bashed - filename <<< $'1a\nLine to insert\n.\nw'
manatwork

1
不适用于所有shell,例如in dash在许多系统上都是/bin/sh
Arcege 2012年

1
这就是为什么我写了“您可以保留一些 echo ”。不放过所有 echo的确实是bash唯一的功能,但减少了echo4至1作品计数dashksh也:echo '1a\nLine to insert\n.\nw' | ed - filename
manatwork 2012年

1
或者只是使用printf %s\\n,它会在您输入的每个arg之后插入换行符,并且不会弄乱要插入的行中嵌入的特殊字符。另外,为什么可以使用ed何时ex可用?
通配符


0

使用sed和(特定于Bash的)ANSI转义码:

# note: \ --> \\
printf '%s\n' 1 2 3 4 5 | sed -e $'1 { s/\\(.*\\)/\\1\\\ninserted line/; }'

0

我会为此使用python

import fileinput

for linenum,line in enumerate(fileinput,FileInput("file",inplace=1)):
    if linenum ==1:
          print ""
          print line.rstrip() 
      else: 
          print line.rstrip()`

0

我只喜欢使用一个显式计数器:

awk '(c==1) {print "new line"} (c!=1) {print $0} {c++}' file

0

最简单的方法使用printfex

printf '%s\n' 1a 'my line to insert' . x | ex file

1a表示“在第一行之后”;在.结束该追加; x表示保存并退出。


0

上面的答案均未提及如何将更改保存到原始文件,这是我认为OP要求的。

当我浏览页面时,这当然是我所需要的。

因此,假设您的文件名为 output.txt

sed -i '1 a This is the second line' output.txt

我的特殊用例是将xsl样式表声明自动添加到junit xml文件中。

sed -i '1 a <?xml-stylesheet type="text/xsl" href="junit-html.xsl"?>' junit.xml

yourownlinux.com/2015/04/…是sed书面介绍中的相关部分。
2016年
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.