ファイルに複数の行を追加する方法


301

ファイルが存在しない場合はそれを探して作成し、これを追加するbashスクリプトを作成しています。

Host localhost
    ForwardAgent yes

だから"line then new line 'tab' then text"私はそれが敏感なフォーマットだと思う。私はあなたがこれを行うことができることを知っています:

cat temp.txt >> data.txt

しかし、その2行からは奇妙に見えます。これをこの形式で追加する方法はありますか?

echo "hello" >> greetings.txt

回答:


526
# possibility 1:
echo "line 1" >> greetings.txt
echo "line 2" >> greetings.txt

# possibility 2:
echo "line 1
line 2" >> greetings.txt

# possibility 3:
cat <<EOT >> greetings.txt
line 1
line 2
EOT

ファイルに書き込むためにsudo(他のユーザー特権)が必要な場合、これを使用します。

# possibility 1:
echo "line 1" | sudo tee -a greetings.txt > /dev/null

# possibility 3:
sudo tee -a greetings.txt > /dev/null <<EOT
line 1
line 2
EOT

2
@TheLegendこれは「ヒアドキュメント」と呼ばれます。マニュアルページのその段落をご覧ください。
ハウケレイジング

1
もう1つの可能性は( echo "line 1" ; echo "line 2" ) >>greetings.txtです。
ott--

2
@ ott--実際のサブシェルは必要ありません(つまり、1つの新しいプロセスを保存できます)。これで十分です。{ echo "line 1" ; echo "line 2"; } >>greetings.txt
Hauke Laging

2
EOTとEOLの違いは何ですか?
チカトモ

15
@cikatomoはcat <<EOTEOT単なるランダムな文字列です。かもしれませcat <<FOOん。
Hauke Laging

60
printf '%s\n    %s\n' 'Host localhost' 'ForwardAgent yes' >> file.txt

または、(質問の4つのスペースではなく)必要なリテラルタブの場合:

printf '%s\n\t%s\n' 'Host localhost' 'ForwardAgent yes' >> file.txt

で同じ効果を達成できますがecho、実装ごとに正確にどのように変化するかprintfは一定ですが



16

別のアプローチは tee

tee -a ~/.ssh/config << END
Host localhost
  ForwardAgent yes
END

teeのmanページからのいくつかの選択行:

teeユーティリティーは、標準入力を標準出力にコピーし、ゼロ個以上のファイルにコピーを作成します。

-a-出力を上書きするのではなく、ファイルに追加します。


6

SEDは次のようにファイルの末尾に行を追加できます。ファイルの

sed -i '$ a text to be inserted' fileName.file
$末尾を選択aし、追加するように指示し、その後に挿入されるテキストが続きます。それからもちろんファイル名。


ソース:http : //www.yourownlinux.com/2015/04/sed-command-in-linux-append-and-insert-lines-to-file.html

========== EDIT == ==========

このアプローチには、他のソリューションよりも利点がありますか?
はい、このアプローチには、次のような検索で返されるファイルに追加するという追加の利点があります。 find . -name "*.html" -exec sed -i '$ a </html>' {} \;

上記の例を使用して、いくつかのディレクトリ内のすべてのhtmlページにない終了htmlタグを挿入しました。

===================================


1
ファイルに複数の行を追加するための構文を表示する場合、これは質問に対する回答になります(非常に有用ではありません)。他のすべての答えは、単に新しいテキストを書くだけです。この回答は、ファイル全体を読み取り、ファイルに加えて、追加されたテキストを書き換えます。このアプローチには他のアプローチよりも利点がありますか?
G-マン

これはGNUでのみ機能しますsed。BSD sedは次のエラーで終了します:command a expects \ followed by text。したがって、スクリプト化されたソリューションにこれを使用しないでください。壊れやすい。BSD構文を必要に応じて(あるいは、それを適切に行うPOSIX互換性があり、GNU上で動作しますsed同様。
ワイルドカード

他の回答はfind、次のように使用できますfind . -name "*.txt" -exec sh -c 'printf "%s\n\t%s\n" "Host localhost" "ForwardAgent yes" >> "$1"' sh {} ";"
G-マン

1
これは、ストリームのリダイレクト(>>>)を実行しないため、実行などの問題の影響を受けないため、非常に優れたソリューションsudo echo 'something' > /fileです。私にとっては、lxdコンテナ内のファイルに次のような行を追加することができますlxc exec c sed -- '$ a newline' /myfile
ドラコATER

echo "a new line" >> foo.fileファイルは改行で終わりではありませんが、ときに新しい行を作成しませんsed -i '$ a a new line' foo.file行いますので、sed特にあなたが常にファイルに新しい行を追加したい優れています。
-zhouji

1

sudoを使用できるので、sedを使用しました。例えば:

sudo sed -i '$ a text to be inserted' fileName.file 

代わりは非常にugいです:

sudo bash -c "echo a text to be inserted >> fileName.file"  

sshを使用した場合はさらに見苦しくなります。


1
なぜこの答えはダウン投票されたのですか?これは私が必要とする解決策のように見えます。それに問題はありますか?そうでない場合は、それを使用して、投票します。
MountainX

あなたsed -iは引数として拡張子を取りませんか?あなたの例には、誤ったパラメーターが含まれている可能性があります。
プロトメタ

1

もう1つのライナーは次のとおりです。

echo "Greetings 1" >> greetings.txt && echo "Greetings 2" >> greetings.txt

-eより多くの制御を提供するため、私はオプションの考えを好むでしょう:

echo -e "Greeting 1\nGreetings 2\n" >> greetings.txt

1

cat >> out.txtPerlまたはPythonでエミュレートして同じ効果を得ることができます。Perl:

perl -e 'open(fh,">>","./out.txt");while(<>){printf(fh "%s",$_)};close(fh);'

そしてPython:

python -c 'import sys;f=open(sys.argv[1],"a");l=[i for i in sys.stdin];f.write("".join(l))' out.txt 

Pythonでは、Ctrl+をD2回押す必要があることに注意してください。詳細については、stackoverflowの関連質問を参照してください。


1

ファイルに複数の行を追加する例を次に示します。

{
        echo '  directory "/var/cache/bind";'
        echo '  listen-on { 127.0.0.1; };'
        echo '  listen-on-v6 { none; };'
        echo '  version "";'
        echo '  auth-nxdomain no;'
        echo '  forward only;'  
        echo '  forwarders { 8.8.8.8; 8.8.4.4; };'
        echo '  dnssec-enable no;'
        echo '  dnssec-validation no;'
} >> your_file.txt

0

主な答えに加えて、ファイルにスーパーユーザー権限が必要な場合、sudo前に追加するだけでechoは機能しません。

これは、シェルがコマンドを中断し、echoルートとして実行された>>が、通常の権限で実行されたためです。

これはスーパーユーザーに対して機能します。 sudo su -c "echo 'Line 3' >> greetings.txt"


suここは必要ありません(sudo su良くありません)。しかし、あなたはシェルのリダイレクトを管理する何かが必要であるという点で正しいです。おそらくsudo sh -c "echo stuff >> file.txt"。ネットの節約はありませんが、より良い方法です。
ロアイマ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.