ファイルの内容を取得するために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"
。
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 êtes ici</pre></strong></body></html>
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
ファイルに行を追加するには、シェル追加リダイレクト演算子>>
を使用できます(ファイルはO_APPEND
フラグでopen(2)
- edされます)。
echo 'My final line' >>file.txt
ここで、view最後の行が追加されたファイルのコンテンツだけが必要な場合は、cat
を2つの引数とともに使用します。
file.txt
としましょうcat
がファイルのみを処理するため)、プロセス記述子<()
を活用してファイル記述子(/proc/self/fd/<fd_number>)
。これらをまとめる:
cat file.txt <(echo 'My final line')
出力をページングする場合、less
がお気に入りのページャーであると仮定します。
less file.txt <(echo 'My final line')
質問へのコメントで既に明確にされていますが、ここに回答として再度追加します。
質問に記載されているコマンド、
(cat file.txt ; echo "My final line") | other command
期待どおりに動作します。括弧で形成されたサブシェルからのすべての出力は、2番目のコマンドにパイプされます。
ファイルが新しい行で終わらない場合、エコーされた文字列は最後の行に追加されます。これは他のすべてのソリューションで共通であり、前に別の(空の)エコーを追加することで解決できます。