printfを使用してファイルの先頭にリッチテキストを挿入する

printfを使用してファイルの先頭にリッチテキストを挿入する

テキストファイルの先頭に特定の形式のコンテンツを追加する必要があります。調べたBashで複数のテキストファイルの先頭と末尾にテキストを追加する方法しかし、私の状況にどのように適応するのかわかりません。

パスワード

printf 'Anything\tyou\twant\tto\tadd' 0a . x | ex printf.csv

期待される出力

$ head -n 1 printf.csv;
Anything     you    want   to    add

注:私はprintf解決策を好みます。

答え1

の場合はex次のようになります。

printf '%b\n' 0a 'Anything\tyou\twant\tto\tadd' . x | ex -s printf.csv

または:

printf '0a\nAnything\tyou\twant\tto\tadd\n.\nx\n' | ex -s printf.csv

パラメータによって認識されるエスケープシーケンスは、フォーマットパラメータ%bのエスケープシーケンスとは異なります。前者は標準でありecho、後者は標準Cに似ています(多くのprintf実装ではこれを拡張しますが)。それとは違いはありませんが、(少なくとも移植性が必要な場合は)パラメータに\tそれを作成する必要があります。\11\011%b

別のオプションは、拡張に%sksh93スタイルの引用符を使用することです。$'...'\t

printf '%s\n' 0a $'Anything\tyou\twant\tto\tadd' . x | ex -s printf.csv

サポートされている場合(少なくともksh93、zsh、bash、FreeBSD sh、busybox ash)、これらの引用$'...'は通常、型パラメータのように標準Cエスケープ(拡張を含む)をサポートしますprintf%bまたはecho

答え2

  1. printfオプションではなく、最初の引数として型文字列を渡します。最初のパラメータがなどの書式指定子を使用しない場合、残りのパラメータ%sは事実上役に立ちません。したがって、エスケープ文字が解釈される最初の引数を使用するには、残りのテキストも\tここに収まる必要があります。
  2. この答えは次のように言います。

    0a「0行の後にテキストを追加する」(つまり、1行の前に)を意味します。次の行は、0行目の後に「追加」されるリテラルテキストです。.行自体のピリオド()は、追加するテキストを終了します。

    0a来なければならない今後追加するテキストです。

したがって、次のようになります。

printf '0a\nAnything\tyou\twant\tto\tadd\n.\nx\n' | ex printf.csv 

例:

% printf '0a\nAnything\tyou\twant\tto\tadd\n.\nx\n' | ex printf.csv
"printf.csv" [New file]
"printf.csv" [New file] 1 line, 25 characters
% cat printf.csv                                                                                 
Anything    you want    to  add

答え3

catコマンドを使用してください。 conCATファイルで使用するように設計されています。

test.txt次の内容を含むファイルがあるとします。

Test file
Here it is

次のように、および printfで始まるテキストを追加できます。catprintf "Some fancy text\n" | cat - test.txt

Some fancy text
Test file
Here it is

出力を別のファイルにリダイレクトし、最後に古いファイルの場所に保存できます(この場合)。

printf "Some fancy text\n" | cat - test.txt > /tmp/insertTestFile && mv /tmp/insertTestFile test.txt

これは単なる概念証明である。実際のシナリオでは、次の制限を考慮する必要があります。

  • 固定名のディレクトリにファイルを作成する/tmpことはお勧めできません。tempfile必要に応じて、コマンドを使用してファイルを生成し、その名前を変数に保存することを検討してください。
  • 他のファイルシステムで使用すると、mvファイルがコピーされます。
  • 上記のソリューションは新しいファイルを作成し、その権限とaclで古いファイルを削除します。

私の目標は、初心者が理解しやすい簡単な解決策を示すことです。この回答にコメントして誤解を招くことを指摘してくれた皆さんに感謝します。

PS。私の好きな方法は次のとおりです。sed -i '1s/^/Added text\n/' file.txt

関連情報