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
。0
eadコマンドに指定されたアドレス。指定されたテキストを「行0以降」(つまり行1より前)に読み込むようにr
指示します。ex
!head -n 1 file2
r
ファイルから直接テキストを読み取る代わりに(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.2
sedバージョンを確認するには:sed --version
- GNU sedは
\
改行文字を省略できます。info sed
、以下にsed Programs
、Common Commands
:
GNU拡張として、 'a'と改行文字の間に空白'\'以外のシーケンスがある場合、 'a'の後に空白ではなく最初の文字で始まるテキスト行が考慮されます。 TEXTブロック。 (これは1行の追加スクリプトの作成を簡素化できます。)この拡張は、「i」および「c」コマンドでも機能します。
追加情報
- またはheadコマンドのより短いバージョンもあります
head -1
。しかし、info head
これはobsolete option syntax -[NUM]...
headでサポートされていると主張し、その構文を使用するために「標準ホスト」を推奨するので、ここでは元の構文を引き続き-n NUM
使用できます。head -n 1