web-dev-qa-db-ja.com

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

ファイルが存在しない場合はファイルを検索するbashスクリプトを作成してから作成し、次のように追加します。

Host localhost
    ForwardAgent yes

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

cat temp.txt >> data.txt

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

echo "hello" >> greetings.txt
346
TheLegend
# 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
604
Hauke Laging
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は定数であるのに対して、実装によってどのように変化するかは正確です。

64
evilsoup
echo -e "Hello \nWorld \n" >> greetings.txt
42
kendotwill

別のアプローチはteeを使用することです

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

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

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

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

22
user206934

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

==========編集============

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

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

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

6
OB7DEV

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

{
        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
3
user2753331

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

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

代替案は非常に醜いです:

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

sshを使用すると、さらに醜くなります。

1
Fred Mehrdad

同じ効果を得るために、PerlまたはPythonのいずれかを使用してcat >> out.txtをエミュレートできます。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+D 二回。詳細は stackoverflowの関連質問 を参照してください。

1

別のライナーは次のとおりです。

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

-eオプションは、より多くの制御を可能にするため、考えました:

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

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

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

これはスーパーユーザーで機能します:Sudo su -c "echo 'Line 3' >> greetings.txt"

0
SJ00