特定の行のファイルにテキストを追加するためにsed
コマンドを見回してきました。これは、1行目にテキストを追加すると機能します。
sed '1 a\
しかし、私はそれを追加したいと思いますbefore 1行目。
sed '0 a\
しかし、私はこのエラーを受け取ります:invalid usage of line address 0
。
なにか提案を?
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
)と同じ効果を得ます)。
エコーはテキストを取得するために使用されます。 Cat filename-ファイルをコンソールに出力し、>を使用して別のファイルfilename1に送信します。次に、filename1をfilenameに移動して、目的のファイルの最初の行にテキストを挿入します。
(echo "some text" && cat filename) > filename1 && mv filename1 filename
VimはExモードで使用できます。
ex -s -c '1i|Sunday Monday' -c x file
1
最初の行を選択
i
テキストと改行を挿入
x
保存して閉じる
GNU awk> = 4.1を使用:
awk -i inplace 'BEGINFILE{print "first line"}{print}' foo.sh
すべてのsed
回答とは逆に、これは空のファイルでも機能します。
appendの後ではなく、最初の行の前にinsertテキストを使用したいので、
sed '1 i\
your_text' your_file
Hereドキュメントも役立ちます。
cat /dev/stdin your_file <<EOI
Your text
goes here
EOI
sed -i '1i new_text' file_name
-i
オプションを指定しない場合、エラーは表示されず、標準端末に出力が表示されますが、ファイルにテキストは挿入されません。
この古い質問では、誰も最も一般的な(この場合は非常に単純な)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
0a
試行したコマンドdoesは 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は変更をファイルに保存して終了します。
ファイルにキャリッジリターンまたはラインフィードなしで最初の行の前にテキストhelloを追加するmyfile
sed -i '1s/^/hello /' myfile
これにより、ファイル全体が端末に出力されることもありません。
BSD sed(MacOS)と変数からのテキストの挿入に問題があったので、次のようにしました。
headers=a,b,c
sed -i '' -e "1{x;s/^.*/$headers/p;x;} some_file"
説明
1{...}
これは最初の行にのみ影響しますx
現在の行をホールドスペースとスワップします(現在は空)s/../../p
(現在は空の行)を期待されるテキストに置き換え(これにより改行の問題が回避されます)、それを出力します(最初の行が印刷されます)。x
再度スワップして、ホールドスペースにあったファイルの最初の行をパターンスペースに取得します。残念ながら、上記のすべての回答(主に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
誰かが興味を持っているなら、私の問題は同じヘッダー行をいくつかのファイルに挿入することでした。提案された解決策のおかげで、私はこれを思いつきました:
sed -i 1i\ $(cat header_line) data.csv
どこ header_line
は、必要な最初の行を含むファイルです。