web-dev-qa-db-ja.com

catコマンドでファイルに行を追加しますか?

ファイルの内容を取得するためにcat file.txtを実行できますが、自分で選択した最後の行に追加したいです。

(cat file.txt ; echo "My final line") |をパイピングしようとしましたが、パイプを通過するのは最終行のみです。猫と最終ラインに参加するにはどうすればよいですか?

明確化のために編集:ファイル自体を変更したくない。 echo "My final line" >> file.txtまたはecho "My final line" | tee -a file.txtを実行できる場合は、この特定のコマンドのコンテキスト内で追加しようとしているだけなので、file.txtおよび"My final line"

11
DoubleBass

catのstdinからの読み取り機能と、複数のファイルの読み取り機能を組み合わせて、これを実現できます。

~$ cat file.txt
Hello from file.txt

~$ echo "My final line" | cat file.txt -
Hello from file.txt
My final line

次のような行を追加することもできます。

~$ echo "My final line" | cat - file.txt
My final line
Hello from file.txt

1行に限定されないことに注意してください。 catは、EOFに達するまでstdinから読み取ります。たとえば、curlの出力を先頭に追加したり、catの出力に追加したりできます。

~$ curl -s http://perdu.com | cat file.txt -
Hello from file.txt
<html><head><title>Vous Etes Perdu ?</title></head><body><h1>Perdu sur l'Internet ?</h1><h2>Pas de panique, on va vous aider</h2><strong><pre>    * <----- vous &ecirc;tes ici</pre></strong></body></html>
29
sed -e '$aMy final line' file.txt

man sedオプション-eから

-e script, --expression=script
    add the script to the commands to be executed

$は最後の行と一致し、aは文字列を追加します。

ファイルに行を永続的に追加する場合は、-iを使用します

-i[SUFFIX], --in-place[=SUFFIX]
    edit files in place (makes backup if SUFFIX supplied)

コマンドを変更する

sed -i -e '$aMy final line' file.txt
11
Katu

ファイルに行を追加するには、シェル追加リダイレクト演算子>>を使用できます(ファイルはO_APPENDフラグでopen(2)- edされます)。

echo 'My final line' >>file.txt

ここで、view最後の行が追加されたファイルのコンテンツだけが必要な場合は、catを2つの引数とともに使用します。

  • まず、ファイルを明らかに、file.txtとしましょう
  • 2番目の引数は選択した文字列であり、文字列をファイル名として渡すには(catがファイルのみを処理するため)、プロセス記述子<()を活用してファイル記述子(/proc/self/fd/<fd_number>)

これらをまとめる:

cat file.txt <(echo 'My final line')

出力をページングする場合、lessがお気に入りのページャーであると仮定します。

less file.txt <(echo 'My final line')
9
heemayl

質問へのコメントで既に明確にされていますが、ここに回答として再度追加します。

質問に記載されているコマンド、

(cat file.txt ; echo "My final line") | other command

期待どおりに動作します。括弧で形成されたサブシェルからのすべての出力は、2番目のコマンドにパイプされます。

ファイルが新しい行で終わらない場合、エコーされた文字列は最後の行に追加されます。これは他のすべてのソリューションで共通であり、前に別の(空の)エコーを追加することで解決できます。

7
Paŭlo Ebermann