特定の単語/パターンの一致数を見つけるために、特定のディレクトリの下のすべてのファイルを検索したいと思います。しかし、ファイル名の直後に数字が現れることを望みます。
次のようにしましたが、最後の行ではなく新しい行に数が記録されます。
grep -rc "WORD" /home/user/data >> file
実際の出力
foo
12
希望の出力:
foo12
答え1
を使用すると、>> file
ファイルは追加モードのstdoutで開きます。したがって、すべての出力はファイルの末尾にあります。
grep
書いた12\n
。あなたのファイルはfoo\n
事前に含まれています。それからそこにありますfoo\n12\n
。を取得するためにfoo12\n
最後に出力する必要はありませんが、最後の前の最後のバイトを上書き\n
します12\n
。
一部のシェルには対応する演算子があります。
そしてzsh
:
zmodload zsh/system
if sysseek -u 1 -w end -1; then
grep -c WORD /home/user/data
else
syserror -p "Can't seek to just before the end: "
fi 1<> file
そしてksh93
:
grep -c WORD /home/user/data 1<> file >#((EOF - 1))
<>
読み取り+書き込みモードでファイルを開くリダイレクト演算子です。ここで私たちは気にしません読む一部ですが、<>
逆の方法で使用する>
と、ファイルは切り捨てられません。
とにかくこれ追加モデル。他のプロセスも同時にファイルに書き込んだり切り捨てたりすると、違いを確認できます(あなたの場合は問題になる可能性が低い)。
別のアプローチは、ファイルを切り取り、末尾を削除してから\n
ファイルを開くことです。追加モデル。
GNUの使用truncate
:
truncate -s -1 file && grep -c WORD /home/user/data >> file
答え2
sedを使用して最後の行の末尾に追加できます。
sed -i '$ s/$/'$(grep -rc "WORD" /home/user/data)'/' file
また見なさい:改行なしでエコでテキストを追加する