web-dev-qa-db-ja.com

ファイルの最初の行の前にテキストを挿入する方法は?

特定の行のファイルにテキストを追加するためにsedコマンドを見回してきました。これは、1行目にテキストを追加すると機能します。

sed '1 a\

しかし、私はそれを追加したいと思いますbefore 1行目。

sed '0 a\

しかし、私はこのエラーを受け取ります:invalid usage of line address 0

なにか提案を?

83
Manolo

sedの挿入(i)オプションを使用して、前の行にテキストを挿入します。

sed '1 i\

質問作成者の更新:

ファイルを適切に編集するには、GNU sedを使用して--iオプションを追加する必要がありました。

sed -i '1 i\anything' file

構文も

sed  -i '1i text' filename

非GNU sedの場合

バックスラッシュ1i\の直後とfirst_line_textの直後でReturnキーを押す必要があります。

sed -i '1i\
first_line_text
'

また、GNU以外の一部のsed実装(macOSでの実装など)require-iの引数も必要です。フラグ(-i ''を使用してGNU sed)と同じ効果を得ます)。

117
suspectus

エコーはテキストを取得するために使用されます。 Cat filename-ファイルをコンソールに出力し、>を使用して別のファイルfilename1に送信します。次に、filename1をfilenameに移動して、目的のファイルの最初の行にテキストを挿入します。

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

VimはExモードで使用できます。

ex -s -c '1i|Sunday Monday' -c x file
  1. 1最初の行を選択

  2. iテキストと改行を挿入

  3. x保存して閉じる

18
Steven Penny

GNU awk> = 4.1を使用:

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

すべてのsed回答とは逆に、これは空のファイルでも機能します。

8
rudimeier

appendの後ではなく、最初の行の前にinsertテキストを使用したいので、

sed '1 i\
your_text' your_file

Hereドキュメントも役立ちます。

cat /dev/stdin your_file <<EOI
Your text
goes here
EOI
7
Joseph R.
sed  -i '1i new_text' file_name

-iオプションを指定しない場合、エラーは表示されず、標準端末に出力が表示されますが、ファイルにテキストは挿入されません。

6
devi.

この古い質問では、誰も最も一般的な(この場合は非常に単純な)sedコマンドを示していないことに驚いています。

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

これは、ほとんどのシェルで機能し、ファイルに有効な行が少なくとも1つ含まれていれば、いくつかのsedバージョンに移植できます。
GNU sedが利用可能な場合、これを使用できます:

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

違いは、GNU sedでは、改行に\nを使用できるため、バックスラッシュを前に付けたリテラルの改行が必要です(GNUとにかくsed)。

$'…'構文を受け入れるシェルが使用されている場合は、改行を直接挿入できるため、sedは改行がすでにそこにあることを確認します。

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

これは、より多くのsedバージョンで機能します。

ファイルに行がない場合(つまり、空の場合)は、次のようにします。

$ echo "new_text" > file_name
2
Isaac

0a試行したコマンドdoesexviの前身 で機能します:

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

printfコマンド自体は以下を出力します。

0a
Anything you want to add
.
x

0aは、0番目の行の後に(つまり、最初の行の前に)追加することを意味します。

次の行または複数行は、追加するリテラルテキストです。

.単独の行で「追加」コマンドを終了します。

xを指定すると、Exは変更をファイルに保存して終了します。

2
Wildcard

ファイルにキャリッジリターンまたはラインフィードなしで最初の行の前にテキストhelloを追加するmyfile

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

これにより、ファイル全体が端末に出力されることもありません。

0
FastGTR

BSD sed(MacOS)と変数からのテキストの挿入に問題があったので、次のようにしました。

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

説明

  • 1{...}これは最初の行にのみ影響します
  • x現在の行をホールドスペースとスワップします(現在は空)
  • s/../../p(現在は空の行)を期待されるテキストに置き換え(これにより改行の問題が回避されます)、それを出力します(最初の行が印刷されます)。
  • x再度スワップして、ホールドスペースにあったファイルの最初の行をパターンスペースに取得します。
0
estani

残念ながら、上記のすべての回答(主にsedを使用)は、最初の行をすべて置き換えたため、うまくいきませんでした。私はUbuntu 16.04 LTSマシンを使用しています。これがGNU Awk 4.0.2の回避策です。

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

誰かが興味を持っているなら、私の問題は同じヘッダー行をいくつかのファイルに挿入することでした。提案された解決策のおかげで、私はこれを思いつきました:

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

どこ header_lineは、必要な最初の行を含むファイルです。

0
rookie