テキストファイルに文字列データを追加するUnixコマンドはありますか?
何かのようなもの:
prepend "to be prepended" text.txt
sed -i.old '1s;^;to be prepended;' inFile
-i
は、変更をその場で書き込み、拡張子が指定されている場合はバックアップを取ります。 (この場合、.old
)1s;^;to be prepended;
は、コマンド区切り文字として;
を使用して、指定された置換文字列で最初の行の先頭を置き換えます。printf '%s\n%s\n' "to be prepended" "$(cat text.txt)" >text.txt
誰もこれに言及していないことに驚いています。
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-<<<
を使用すると、次のことができます。
<<< "to be prepended" < text.txt | sponge text.txt
これは1つの可能性です。
(echo "to be prepended"; cat text.txt) > newfile.txt
おそらく中間ファイルを簡単に回避することはできません。
代替手段(シェルのエスケープでは面倒になる可能性があります):
sed -i '0,/^/s//to be prepended/' text.txt
これにより、出力が形成されます。 -は、エコーからのパイプを介して提供される標準入力を意味します。
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
おそらく何も組み込まれていませんが、次のように簡単に独自のものを作成できます。
#!/bin/bash
echo -n "$1" > /tmp/tmpfile.$$
cat "$2" >> /tmp/tmpfile.$$
mv /tmp/tmpfile.$$ "$2"
少なくともそのようなもの...
状況によっては、先頭に追加されるテキストは標準入力からのみ利用可能です。その後、この組み合わせが機能します。
echo "to be prepended" | cat - text.txt | tee text.txt
tee
出力を省略したい場合は、> /dev/null
を追加します。
解決:
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
replace入力ファイルで問題ない場合:
注:そうすると予期しない副作用が発生する可能性があり、特にシンボリックリンクを通常のファイルに置き換えて、ファイルに対するさまざまな許可、およびファイルの作成(生年月日)の日付の変更。
sed -i
、 Prince John Wesleyの答え のように、少なくとも元の権限を復元しようとしますが、他の制限が適用されます。
{ printf 'line 1\nline 2\n'; cat text.txt; } > tmp.txt && mv tmp.txt text.txt
注:groupコマンド{ ...; ... }
を使用する方が、subshell((...; ...)
)を使用するよりも効率的です。
入力ファイルを編集する必要がある場合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を介して。1i
は1
(1行目)を現在の行にし、挿入モード(i
)を開始します。.
で終了します。w
は結果を入力ファイルに書き戻します(テストの場合、w
を,p
に置き換えて、入力ファイルを変更せずにprintにのみ結果を返します)。sed
を使用する別の方法:
sed -i.old '1 {i to be prepended
}' inFile
付加する行が複数行の場合:
sed -i.old '1 {i\
to be prepended\
multiline
}' inFile
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だけです。
別のかなり単純なソリューションは次のとおりです。
$ echo -e "string\n" $(cat file)
Vi/vimが好きなら、これはもっとあなたのスタイルかもしれません。
printf '0i\n%s\n.\nwq\n' prepend-text | ed file
# 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
ここでの回答はどれも好きではなかったので、独自のコマンドpre
を作成しました。
Goでインストール:
go get -u github.com/Flaque/pre
以下を使用して、stdinからテキストをファイルに追加します。
echo "some at the start" | pre myFile.txt | sponge myFile.txt
このコマンドは所定の場所に書き込むのではなく、標準出力に出力するだけなので、ファイルを保存するには最後にsponge
からmoreutils
が必要です。
関数を定義してから、必要に応じてインポートして使用することをお勧めします。
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
変更ログアップデータを実装するためにこのアプローチを使用しようとしています。