web-dev-qa-db-ja.com

テキストをファイルに追加するUnixコマンド

テキストファイルに文字列データを追加するUnixコマンドはありますか?

何かのようなもの:

prepend "to be prepended" text.txt
98
One Two Three
sed -i.old '1s;^;to be prepended;' inFile
  • -iは、変更をその場で書き込み、拡張子が指定されている場合はバックアップを取ります。 (この場合、.old
  • 1s;^;to be prepended;は、コマンド区切り文字として;を使用して、指定された置換文字列で最初の行の先頭を置き換えます。
86
printf '%s\n%s\n' "to be prepended" "$(cat text.txt)" >text.txt
146
shime

プロセス置換

誰もこれに言及していないことに驚いています。

cat <(echo "before") text.txt > newfile.txt

これは、受け入れられた回答よりも間違いなく自然です(何かを出力して置換コマンドにパイプすることは、辞書編集的に直感に反します)。

...そして、ライアンが上記のことをハイジャックします。spongeを使用すると、一時ファイルは必要ありません。

Sudo apt-get install moreutils
<<(echo "to be prepended") < text.txt | sponge text.txt

編集:これはBourne Shell /bin/shでは機能しないようです


Here String(zshのみ)

Here-string-<<<を使用すると、次のことができます。

<<< "to be prepended" < text.txt | sponge text.txt
28

これは1つの可能性です。

(echo "to be prepended"; cat text.txt) > newfile.txt

おそらく中間ファイルを簡単に回避することはできません。

代替手段(シェルのエスケープでは面倒になる可能性があります):

sed -i '0,/^/s//to be prepended/' text.txt
27
0xC0000022L

これにより、出力が形成されます。 -は、エコーからのパイプを介して提供される標準入力を意味します。

echo -e "to be prepended \n another line" | cat - text.txt

ファイルを書き換えるには、入力ファイルにパイプで戻ることができないため、一時ファイルが必要です。

echo "to be prepended" | cat - text.txt > text.txt.tmp
mv text.txt.tmp text.txt
16
Adam

Adamの方が好き answer

sponge を使いやすくすることができます。一時ファイルを作成して名前を変更する必要はありません。

echo -e "to be prepended \n another line" | cat - text.txt | sponge text.txt
14
ryan

おそらく何も組み込まれていませんが、次のように簡単に独自のものを作成できます。

#!/bin/bash
echo -n "$1" > /tmp/tmpfile.$$
cat "$2" >> /tmp/tmpfile.$$
mv /tmp/tmpfile.$$ "$2"

少なくともそのようなもの...

7
Rob I

状況によっては、先頭に追加されるテキストは標準入力からのみ利用可能です。その後、この組み合わせが機能します。

echo "to be prepended" | cat - text.txt | tee text.txt

tee出力を省略したい場合は、> /dev/nullを追加します。

6
sehari24jam

解決:

printf '%s\n%s' 'text to prepend' "$(cat file.txt)" > file.txt

展開がないため、これはあらゆる種類の入力で安全であることに注意してください。たとえば、!@#$%^&*()ugly text\n\t\nを先頭に追加する場合、機能します:

printf '%s\n%s' '!@#$%^&*()ugly text\n\t\n' "$(cat file.txt)" > file.txt

考慮すべき最後の部分は、コマンド置換"$(cat file.txt)"中のファイルの終わりでの空白の削除です。これに対するすべての回避策は比較的複雑です。 file.txtの最後で改行を保持する場合は、次を参照してください: https://stackoverflow.com/a/22607352/1091436

6
VasiliNovikov

replace入力ファイルで問題ない場合:

注:そうすると予期しない副作用が発生する可能性があり、特にシンボリックリンクを通常のファイルに置き換えて、ファイルに対するさまざまな許可、およびファイルの作成(生年月日)の日付の変更

sed -iPrince John Wesleyの答え のように、少なくとも元の権限を復元しようとしますが、他の制限が適用されます

 { printf 'line 1\nline 2\n'; cat text.txt; } > tmp.txt && mv tmp.txt text.txt

注:groupコマンド{ ...; ... }を使用する方が、subshel​​l(...; ...))を使用するよりも効率的です。


入力ファイルを編集する必要がある場合in place(そのiノードをすべての属性とともに保持する)

由緒ある ed POSIXユーティリティ の使用:

注:edは常に入力ファイルを常に読み取ります全体としてを最初にメモリに読み込みます。

ed -s text.txt <<'EOF' 
1i
line 1
line 2
.
w
EOF
  • -s抑制edのステータスメッセージ。
  • 複数行としてedにコマンドが提供される方法に注意してください here-document<<'EOF' ... EOF)、つまりstdinを介して。
  • 1i1(1行目)を現在の行にし、挿入モード(i)を開始します。
  • 次の行は、挿入するテキストですbefore現在の行で、その行で.で終了します。
  • wは結果を入力ファイルに書き戻します(テストの場合、w,pに置き換えて、入力ファイルを変更せずにprintにのみ結果を返します)。
5
mklement0

sedを使用する別の方法:

sed -i.old '1 {i to be prepended
}' inFile

付加する行が複数行の場合:

sed -i.old '1 {i\ 
to be prepended\
multiline
}' inFile
3
Mert Nuhoglu

Bash(Ubuntu)でテスト済み、テストファイルから開始する場合

echo "Original Line" > test_file.txt

実行できます。

echo "$(echo "New Line"; cat test_file.txt)" > test_file.txt

または、bashのバージョンが$()には古すぎる場合は、バックティックを使用できます。

echo "`echo "New Line"; cat test_file.txt`" > test_file.txt

「test_file.txt」の次の内容を受信します。

New Line
Original Line

中間ファイルはなく、bash/echoだけです。

3
AlexanderESmith

別のかなり単純なソリューションは次のとおりです。

    $ echo -e "string\n" $(cat file)
2
Pat

Vi/vimが好きなら、これはもっとあなたのスタイルかもしれません。

printf '0i\n%s\n.\nwq\n' prepend-text | ed file
1
Ian Kelling
# create a file with content..
echo foo > /tmp/foo
# prepend a line containing "jim" to the file
sed -i "1s/^/jim\n/" /tmp/foo
# verify the content of the file has the new line prepened to it
cat /tmp/foo
0
Jim

ここでの回答はどれも好きではなかったので、独自のコマンドpreを作成しました。

Goでインストール:

go get -u github.com/Flaque/pre

以下を使用して、stdinからテキストをファイルに追加します。

echo "some at the start" | pre myFile.txt | sponge myFile.txt

このコマンドは所定の場所に書き込むのではなく、標準出力に出力するだけなので、ファイルを保存するには最後にspongeからmoreutilsが必要です。

0
Evan Conrad

関数を定義してから、必要に応じてインポートして使用することをお勧めします。

prepend_to_file() { 
    file=$1
    text=$2

    if ! [[ -f $file ]] then
        touch $file
    fi

    echo "$text" | cat - $file > $file.new

    mv -f $file.new $file
}

その後、次のように使用します。

prepend_to_file test.txt "This is first"
prepend_to_file test.txt "This is second"

ファイルの内容は次のようになります。

This is second
This is first

変更ログアップデータを実装するためにこのアプローチを使用しようとしています。

0
AwesomeBobX64