Bash

使用 printf 在文件開頭插入帶格式的文本

  • May 22, 2020

我需要在文本文件的開頭附加具有特定格式的內容。我研究瞭如何在 Bash 中將文本附加到多個文本文件的開頭和結尾,但不確定如何適應我的情況。

程式碼

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

預期產出

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

注意:我更喜歡一個printf解決方案。

  1. printf將格式字元串作為第一個非選項參數。如果第一個參數沒有使用格式說明符%s,那麼其餘參數實際上是無用的。因此,如果您想使用第一個參數,因為這\t是解釋轉義字元的地方,則必須使其余文本也適合其中。
  2. 正如那個答案所說:

0a表示“在第 0 行之後附加文本”(換句話說,在第一行之前)。下一行是要在第 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

隨著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(至少如果您想便攜的話)。

另一種選擇是使用%s但使用 ksh93 樣式的$'...'引號進行\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)。

引用自:https://unix.stackexchange.com/questions/588318