コマンドラインでファイルの各行の先頭に文字列を追加する最も簡単な方法は何ですか?

コマンドラインでファイルの各行の先頭に文字列を追加する最も簡単な方法は何ですか?

各行の先頭に文字列を追加する方法を探しています(各行に同じ文字列を使用)。カスタマイズすることはできませんが、覚えやすく、すべてのPOSIX互換プラットフォーム(およびすべてのシェル)で使用できます。

答え1

:|paste -d'foo ' - - - - input > output

(冗談です。ここで公開されているすべての解決策の中で最速の解決策を見つけることもできます。:-b)。

正式な方法は次のとおりです。

sed 's/^/foo /' < input > output

ただし、任意の文字列に簡単に適用することはできません。例えば、

sed "s/^/$var /"

、または改行文字を$var含まない場合にのみ有効であり、少なくともGNU sedの任意のコマンド実行の脆弱性は保証されません。&\/

これに関して、

export var
awk '{print ENVIRON["var"], $0}'

または

perl -pe '$_="$ENV{var} $_"'

うまく動作します。

答え2

あなたはそれを使用することができますsed

sed -i 's/^/your_string /' your_file

コメントいただいたStephaneとMarcoに感謝します。この-iオプションは POSIX ではありません。上記のタスクを実行するPOSIXメソッドは次のとおりです。

sed 's/^/your_string /' your_file > tmp_copy && mv tmp_copy your_file

またはperl:

perl -pi -e 's/^/your_string /' your_file

説明する

どちらのコマンドも正規表現置換を実行して、行^の先頭()を目的の文字列に置き換えます。両方のコマンドのスイッチは、ファイルが-iその場所で編集されることを保証します(つまり、変更は標準出力として印刷されず、ファイルに反映されます)。

sedすべてのPOSIX準拠のオペレーティングシステムで動作し、perl以下を除くほとんどの最新のUnixで動作する必要があります。もう一生懸命働いた削除してください。

答え3

awk私はプレフィックス文字列 "foo"を使って解決策を思いつきました。

awk '{ print "foo", $0; }' input > output

awkクロスプラットフォームであり、すべてのPOSIXシステムで使用できます。内部編集は行われません。 2番目のファイルを作成せずに1つのファイルを編集するには、一時ファイルを使用する必要があります。sed構文を示すJosephの答えを参照してください。別のトリックは、基本的に、元のファイルと同じファイル名を持つ一時ファイルを生成する次の構文を使用することです。

{ rm file; awk '{ print "foo", $0 }' > file; } < file

答え4

perlこれを行うには、次の方法を使用できます。

$ perl -pi -e 's/^/mystring /' afile.txt

はい

サンプルファイルを作成します。

$ seq 5 > afile.txt

$ cat afile.txt
1
2
3
4
5

上記のコマンドを実行します。

$ perl -pi -e 's/^/mystring /' afile.txt

$ cat afile.txt
mystring 1
mystring 2
mystring 3
mystring 4
mystring 5

関連情報