コマンドラインを使用してテキストファイルの先頭に行を挿入するにはどうすればよいですか?


25

既存のファイルの先頭にテキストを挿入したい。どうすればこれを達成できますか。私が試したechoteeが、成功しませんでした。

sources.listターミナルからファイルの先頭にレポ行を挿入しようとしていました。

注意

別の回答の方法がすでにわかっているため、1行の迅速な解決策が必要です。


1
teeは、ファイルの下部に行を追加します。たとえばecho "deb http://extras.ubuntu.com/ubuntu precise main" | sudo tee -a /etc/apt/sources.list、管理者権限を取得するには、teeの前にsudoも必要です。しかし、いったいどうしてsources.listの一番上に何かを追加したいのでしょうか?
サヴァスラデビッチ

2
@medigeek:OPの質問履歴のどこかで、CDリポジトリからのインストール/更新について何かを見つけることができます...私はそれが理由かもしれないと疑っています...-
ish

@izxに感謝します、あなたの仮定は正しいです。私は静かに感銘を受けました。その質問に答えることができますか。それは、ソフトウェアセンターを使用してローカルリポジトリからインストールし、ローカルリポジトリを最上位に配置せずに最高の優先度に設定することについてでした。再度、感謝します。
アンワール

1
@izx、これは私のローカルリポジトリに最高の優先順位を設定することに関するリンクです。ソフトウェアセンターに関するこの質問もチェックできれば嬉しいです。最初のコメントをありがとう。とても嬉しかったです。
アンワール

1
@medigeek、このような珍しい質問の説明については、この質問をご覧ください。
アンワール

回答:


38

実際には非常に簡単sedです:

  • sed -i -e '1iHere is my new top line\' filename

  • 1iファイルの1行目に続くテキストを挿入するようにsedに指示します。\既存の行1が行2に移動するように、最後の改行を忘れないでください。


1
ありがとう。注:置き換えたい場合sは、iの代わりにuseを挿入する代わりに1i
アンワール

3
悲しいことに、これは空のファイルでは失敗します(最初の行がないため、sedは挿入しません)。
ティノ

@Tino空のファイルには、使用できるだけですecho "Text Here" >> Filename
-Flotolk

MacOS 10では動作しません
クリシュナ

7

一般に、スクリプトを使用して所定の場所で編集するのは難しいですが、使用echocatてからmv

echo "fred" > fred.txt
cat fred.txt t.txt >new.t.txt
# now the file new.t.txt has a new line "fred" at the top of it
cat new.t.txt
# can now do the rename/move
mv new.t.txt t.txt

ただし、sources.listで遊んでいる場合は、これを失いたくないので、エラーなどを検出するための検証と防弾を追加する必要があります。しかし、それは別の質問です:-)


すでにできます。izxが与えたように、1行のソリューションが必要です。しかし、あなたの答えをありがとう。
アンワール

1
@AnwarShah-ああごめんなさい!あなたはあなたの質問でそれを言っているべき
ショーン

私は認めます、あなたの答えとコメントのために+1。(私はもっと与えることはできません)
アンワル

6
./prepend.sh "myString" ./myfile.txt

それprepend私のカスタムシェルであることが知られています

#!/bin/sh
#add Line at the top of File
# @author Abdennour TOUMI
if [ -e $2 ]; then
    sed -i -e '1i$1\' $2
fi

relatifパスまたは絶対パスも使用します。正常に動作するはずです。

./prepend.sh "my New Line at Top"  ../Documents/myfile.txt

更新:

これの永続的なスクリプトが必要な場合nano /etc/bash.bashrcは、ファイルの最後にこの関数を開いて追加します:

function prepend(){
# @author Abdennour TOUMI
if [ -e $2 ]; then
    sed -i -e '1i$1\' $2
fi

}

ターミナルを再度開いて楽しんでください:

prepend "another line at top" /path/to/my/file.txt

5

そして、そのために本物のテキストエディタを使用してみませんか?edは標準のテキストエディターです。

ed -s filename <<< $'1i\nFIRST LINE HERE\n.\nwq'

または、コマンドをより読みやすくしたい場合:

ed -s filename < <(printf '%s\n' 1i "FIRST LINE" . wq)
  • 1:最初の行に移動
  • i:挿入モード
  • 挿入したいもの...
  • .:挿入を停止し、通常モードに戻ります
  • wq:書き込み、終了、ありがとう、さようなら。

これでシェル変数置換を使用する方法はFIRST LINE
vp_arth

1
@vp_arthコンテンツが変数のfirst_line場合:ed -s filename < <(printf '%s\n' 1i "$first_line" . wq)。変数が単一のドットに展開されず、改行文字が含まれていないことを確認してください(ユーザー入力に由来する場合は、サニタイズしてください)。
gniourf_gniourf

3

常にawkオプションがあります。string変数をコンテンツに置き換えます。ただし、これはインプレースの変更ではありません。個人的に、私はその場で変更を加えない傾向があります。これは間違いなく個人的な好みです。2つのこと-vは、awk内の変数を意味し、変数はn行番号を効果的に一致させるためにここで使用されますNR == 1nand の値を変更するだけで、さまざまな方法でこれを使用できますs

string="My New first line"; awk -v n=1 -v s="$string" 'NR == n {print s} {print}'     file.source > file.target

例:

% cat file.source                                                                                                                                      

First Line
Second Line
Third Line

% string="Updated First Line"; awk -v n=1 -v s="$string" 'NR == n {print s} {print}' file.source > file.target; cat ./file.target                      !698

Updated First Line
First Line
Second Line
Third Line

2

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

ex -sc '1i|hello world' -cx sources.list
  1. 1 最初の行を選択

  2. i 新しいテキスト行を挿入

  3. x 保存して閉じます


これまで提供されていた他のソリューションよりもはるかに単純です。ありがとうございました。
ポティカリムトゥ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.