コマンドラインからファイルの2行目に書き込むにはどうすればよいですか?


29

出力ファイルを生成する外部プログラムがあります(潜在的に20K行)。

既存の行1と行2の間に新しい行を挿入する必要があるこれを行う。

回答:


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

12
少し短く:awk 'NR==2 {print "new line"} 1'
グレンジャックマン

@glennjackman:あなたのバージョンは私のシステムでは動作しませんが、答えは動作します。具体的には、2行目が複製され、両方の間に新しい行が挿入されます(3行目など)。
Nikana Reklawyks

2行目から書き込みを開始し、後続のすべての行を上書きする方法はありますか?
CMCDragonkai

@CMCDragonkaiあなたが何を求めているのかよくわかりません。指定したファイルの1行目と2行目を設定して印刷しますか?最初の行、次にファイルの内容?最初のファイルの最初の行と、最初のファイルの残りの各行の2番目のファイルの行 あなたが望むものの非常に具体的な説明と、比較的短いが完全な例で新しい質問をしたいと思うかもしれません。
ケビン

16

あなたの特定のケースでは、これはもっとシンプルなはずです:

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

説明:行1で、以下を実行します

  1. Pは、ラインをRINT
  2. E x保持スペースでパターンスペースを変更します(基本的にバッファーを空にします)

次に、行(今は空)がサイクルの一部として再び印刷されます。


改行文字の代わりに改行を追加したい場合(最初に理解したこと)、単にコマンドを使用します(追加):seda\

sed '1 a\
appended line' your-file

あるいは

sed '1 aappended line' your-file

appended line行1の後に「」を追加します。


1
sed -i '1 a\\' file単なる改行です。
forcefsck

1
@forcefsckはい、唯一の欠点は、私の2番目の'1 aapended line'例として、それがGNUismであることです。
アンガス

8

sedアプローチは次のようになると思います:

sed '2 i whatever_line_of_text_you_wanted_to_INSERT' filename.txt

これにより、テキストがファイルの2行目に取得され、ファイル内の実際の2行目が3行目になります。

使用して、なお追加モードを、それがなければならなかったならば、それは行番号を指摘した後、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

すみません、それは何をしますか?
ニキルマレー

1行目の後に改行を挿入します
-potong

1
または、\n1行目に改行を追加します!
ポトン

1

私は通常edこれに使用します:

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

sedソリューションに似ていますが、エスケープされた改行の乱雑さはありません。


2
echo特に以下の場合は、いくつかを省くことができbashますed - filename <<< $'1a\nLine to insert\n.\nw'
マナトワーク

1
すべてのシェルで機能しません。たとえば、dash多くのシステムでは/bin/shです。
アルセージュ

1
それが私が「あなたはいくつか echoのものをspareしまない」と書いた理由です。スペアリングのすべて echoのは確かにあるbash唯一の機能が、減少echoに4〜1作品からのカウントをdashし、kshあまりにも:echo '1a\nLine to insert\n.\nw' | ed - filename
マナトワーク

1
または、を使用しますprintf %s\\n。これは、指定するすべての引数の後に改行を挿入し、挿入する行に埋め込まれた特殊文字を台無しにしません。また、利用可能なed場合に使用するのexはなぜですか?
ワイルドカード

1

Pythonソリューション

python -c "import sys; lines = sys.stdin.readlines(); lines.insert(1,'New Line\n'); print ''.join(lines).strip()" < input.txt

0

使用sedANSIエスケープコードをと(バッシュ固有):

# 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のよく書かれたイントロの関連部分です。
チム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.