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


11

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"


1
たぶん何かのようなecho "My final line" >> file.txt
edwinksl

コマンド/パイピングだけで、実際に行をファイルオブジェクトに追加したくありません。>>ファイル自体を編集する場合は、行を追加できることを既に知っています。
-DoubleBass

11
誤って消去しましたfile.txtか?パイプスニペットは動作するはずです。
ワラビ

@DoubleBass:Mathieu Mitchellの答えは、ファイル(メモリ内またはディスク)を変更せず、代わりに組み込みコマンドの機能を利用するため、より良いものです。
ブライアンベッチャー

回答:


30

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行に限定されないことに注意してください。catEOFに達するまで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>

1
(cat file.txt ; echo "My final line") | …またそれをします。しかしcat、それが設計されたものに使用する方が、+ 1の方が優れています。
ctrl-alt-delor

@ ctrl-alt-delor:サブシェルには、フォークへの追加プロセスが比較的高価であるという欠点もあります。たとえばecho "$$" "$BASHPID" | head -q -n 1 /proc/mounts - | catvs. ( head -q -n 1 /proc/mounts; echo "$$" "$BASHPID" ) | catまたはを試してください{ head -q -n 1 /proc/mounts; echo "$$" "$BASHPID"; } | cat
デビッドフォースター

11

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

echo 'My final line' >>file.txt

ここで、最後の行を追加してファイルのコンテンツを表示するだけの場合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')

<()bashで動作しますが、他のどのシェルで動作しますか?Ksh?ダッシュ?
jpaugh

1
@jpaugh kshzsh-はい、dash-いいえ。
heemayl

これにより、オリジナルが変更されます。
ctrl-alt-delor

11
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

1
単一引用符を使用すると、バックスラッシュは不要です。
ワイルドカード

7

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

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

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

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

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


1
ファイルが改行で終わらない場合、次を使用しawkますawk 1 file.txt; echo "My final line"awk 1 fileは、ファイルの終わりで失われたEOLを補うための素晴らしいトリックです。
ムル

ファイルが新しい行で終わっていない場合は、echo "\nMy final line"依存せずにそのまま使用することもできますawk
-fregante
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.