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


76

sed特定の行のファイルにテキストを追加するコマンドを探しています。これは、行1の後にテキストを追加することで機能します。

sed '1 a\

しかし、1 行目のに追加したいと思います。

sed '0 a\

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

なにか提案を?


回答:


101

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

sed -i '1i\
first_line_text
'

また、一部の非GNU sed実装(たとえば、macOS上の実装)では、フラグの引数が必要です-i-i ''GNUと同じ効果を得るために使用しますsed)。


1
-iオプションなしでは機能しません。回答する前に回答を更新します。
マノロ

1
ありがとう。どのOSを使用していますか?オリジナルソリューションは、9 openSUSEの上で働いていた
suspectus

1
面白い!私はLubuntu 13.10を使用sed '1 i\this text is entered above the existing first line' fileしています。

2
ここで、使用するには、sed (GNU sed) 4.2.2単に sed '1 i text to insert' -i file魅力のように働きました。ありがとう
トン

1
@FeRD awk以下の私の悪いランクの回答を参照してください。これは動作するはずです。
-rudimeier

18

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

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

7
以下がダウン投票された理由を教えてください
アンキットシャー

1
おそらくOPがsedに言及しているからでしょう。私の意見では、これは賛成に値しません。そのソリューションは私のニーズに最も合っていて、それから賛成でした。
рüффп

私は賛成しました。私にとってはkshで動作します。
arcee123

16

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

ex -sc '1i|ALFA BRAVO' -cx file
  1. 1 最初の行を選択

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

  3. x 保存して閉じます


7

テキストを追加するのではなく、最初の行の前に挿入したいので、使用します

sed '1 i\
your_text' your_file

ヒアドキュメントも役立ちます:

cat /dev/stdin your_file <<EOI
Your text
goes here
EOI

6

GNU awk> = 4.1の使用:

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

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


inplaceはライブラリであり、残念ながらすべてのawkディストリビューションに含まれています。「awk:fatal:読み込みのためにソースファイルを ' GNU Awk 4.2.1, API: 2.0 (GNU MPFR 4.0.1, GNU MP 6.1.2)
inplace

6
sed  -i '1i new_text' file_name

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


問題は-iスイッチに関するものではありません。
-don_crissti

どのようにそれを理解しますか?それ質問への答えです。はい、受け入れられた答えにていますが、まったく同じではありません。
G-マン

@ G-Man-casが使用するテンプレートは理想からかけ離れていると主張するかもしれませんが、実際、これはほぼ同一のように似ています...違いはスペースとバックスラッシュがないという事実です。私が懸念している限り、それらは技術的には同一です(両方とも特定であり、バックスラッシュなしで受け入れられることが起こるためです)。他の人がこれが別の答え+賛成票を正当化すると考えるなら...まあ。gnu sedgnu sedi
-don_crissti

2

0aあなたが試みたコマンドがないで動作しex、前任者にはvi

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はファイルへの変更を保存して終了します。


1

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

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

これはほとんどのシェルで動作し、いくつかのsedバージョンに移植可能です。
GNU sedが利用可能な場合、これを使用できます。

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

違いは、GNU sed \nでは改行にa を使用できることと、バックスラッシュが先行するリテラル改行が必要なことです(GNU sedでも動作します)。

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

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

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


-1

残念ながら、上記のすべての回答(ほとんどが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

1
何を言っているのかわからない... sed置換を使用する答えは1つだけですが、既存の行を置換しません。
don_crissti

-1

始めと終わり

ファイルの先頭/末尾にテキストを挿入/追加する方法を検索した人は、おそらく他の方法も知っている必要があると思います。

cal |                            \
  gsed -E                        \
       -e     '1i\{'             \
       -e     '1i\  "lines": ['  \
       -e 's/(.*)/    "\1",/'    \
       -e '$s/,$//'              \
       -e     '$a\  ]'           \
       -e     '$a\}'

説明

これは、cal出力がgnu-するパイプsed(と呼ばれるgsed介してインストールMacOSでbrew.sh拡張正規表現(と)-E)及び6「スクリプト」適用(-e)でエスケープ改行\読みやすくするため。スクリプト1と2は1i\、「1行目で挿入」に使用します。スクリプト5および6は$a\、「行<last>で追加」するために使用します。テキスト出力を垂直方向に揃えて、結果に期待されるものをコードに表示させました。スクリプト3および4は置換を行います(後者は「行<最後>」にのみ適用されます)。その結果、コマンド出力が有効なJSONに変換されます。

出力

{
  "lines": [
    "    October 2019      ",
    "Su Mo Tu We Th Fr Sa  ",
    "       1  2  3  4  5  ",
    " 6  7  8  9 10 11 12  ",
    "13 14 15 16 17 18 19  ",
    "20 21 22 23 24 25 26  ",
    "27 28 29 30 31        ",
    "                      "
  ]
}

私はあなたの質問に投票していませんが、受け入れられたものを含め、望ましい結果を示すいくつかの答えがすでにあることに注意してください。
ジェフシャラー

@JeffSchaller Stack Exchangeコミュニティはフォーラムではありません。その目的は、OPのブロック解除を支援することを超えています。目標は、回答を検索するときに求職者が偶然見つけることができる多くのオプションをグローバル知識ベースにシードすることです。私が回答にタイトルを付けた理由は、ユーザーがGoogleの結果をクリックする前に、この回答の有用性をユーザーが認識できるようにするためです。
ブルーノブロノスキー

私が言っているのは、あなたの答えは、この質問の将来の読者に新しいオプション(答え)を提供していないということです。のバリエーションを使用して1i、最初の行の前にテキストを挿入する4つの回答が既にあります。この質問を持つ人は、彼らの問題を解決するためにあなたの答えから必要な部分を抽出する必要があります。質問は無料ですので、具体的な答えを提供するために、あなた自身の質問をしてください。
ジェフシャラー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.