あるファイルの最初の行を別のファイルの最初の行に挿入するには?

あるファイルの最初の行を別のファイルの最初の行に挿入するには?

headファイルの最初の行を取得するコマンドと、ファイルsedの最初の行の前に挿入するコマンドがあります。他のファイルから抽出された最初の行の前に、1つのファイルから抽出された最初の行を挿入できるように、それらをどのように組み合わせることができますか?

ファイルの最初の行を取得します

head -n 1 file_to_get_first_line_from

最初の行の前に挿入

sed -i '1 i\insert_this_in_the_first_line' file_to_intert_into

答え1

file_to_insert_into末尾が改行文字でない場合:

$ cat <<IN > file_to_insert_into
$(head -n1 file_to_get_first_line_from; cat file_to_insert_into)
IN

答え2

最も携帯性の良い方法は次のとおりです。POSIX 指定関数ex

$ cat file1
Jack and Jill
Went up the hill
To fetch a pail of water.

$ cat file2
Nursery Rhymes:
Epic Poems:
Classic Literature:

$ printf '%s\n' '0r !head -n 1 file2' x | ex file1

$ cat file1
Nursery Rhymes:
Jack and Jill
Went up the hill
To fetch a pail of water.
  • printfにコマンドを送信するために使用されますex
  • 0eadコマンドに指定されたアドレス。指定されたテキストを「行0以降」(つまり行1より前)に読み込むようにr指示します。ex

  • !head -n 1 file2rファイルから直接テキストを読み取る代わりに(aみんなファイル)、headまずコマンドを実行し、対応する出力(指定された位置、行0)を読み取ります。

  • x保存して終了するという意味です。

これはPOSIXと完全に互換性があり、移植可能です。


このスクリプトを作成する場合は、前提を確認することをお勧めします。存在しfile2て読み取ることができ、file1存在する場合は読み書きできます。

if [ -r file2 ] && [ -f file2 ] && { ! [ -e file1 ] || { [ -r file1 ] && [ -w file1 ];};}; then
  printf '%s\n' '0r !head -n 1 file2' x | ex file1
fi

答え3

Vimを使用して、次の操作を行いますhead

vim -Nesc '0r !head -n1 file_to_get_first_line_from' +wq file_to_insert_into
  • -Nes互換性のない自動exモードを有効にします。 Vimを使用してジョブをスクリプト化するときに便利です。
  • -c '0r !<cmd>'<cmd>最初の行の前にコマンド出力を挿入します。ここでのコマンドはもちろんheadコマンドです。
  • +wqファイルを保存して閉じます。

答え4

修正する:GNU Sedの違いを指摘してくれた@Wildcardに感謝します。

ノースダコタsed

ターミナルで次のことを試してください。

sed -i '' "1i\
$(head -n 1 file_to_get_first_line_from)" file_to_insert_into
  • これは、入力を開始しsed -i '' "1i\てEnterを押して残りのコマンドを続行することを意味します。

説明する

  • Bashコマンド置換を使用して、2つの元のコマンドを結合します$( )$( )内部のbashコマンドを対応する出力に置き換えます。
  • sedコマンドを正しく表示するために引用符を使い続けながら、Bashが操作を実行できるように'リテラル引用符を引用符に変更しました。"sed

牛に似た一種の栄養sed

またはGNU sedがある場合:

sed -i "1i $(head -n 1 file_to_get_first_line_from)" file_to_insert_into
  • テスト目的でsed (GNU sed) 4.2.2sedバージョンを確認するには:sed --version
  • GNU sedは\改行文字を省略できます。info sed、以下にsed ProgramsCommon Commands

GNU拡張として、 'a'と改行文字の間に空白'\'以外のシーケンスがある場合、 'a'の後に空白ではなく最初の文字で始まるテキスト行が考慮されます。 TEXTブロック。 (これは1行の追加スクリプトの作成を簡素化できます。)この拡張は、「i」および「c」コマンドでも機能します。

追加情報

  • またはheadコマンドのより短いバージョンもありますhead -1。しかし、info headこれはobsolete option syntax -[NUM]...headでサポートされていると主張し、その構文を使用するために「標準ホスト」を推奨するので、ここでは元の構文を引き続き-n NUM使用できます。head -n 1

関連情報