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

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

各行の先頭に文字列を追加する方法 (各行に同じ文字列) を探しています。カスタマイズ可能なものではなく、覚えやすく、すべての 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両方のコマンドのスイッチにより、ファイルがその場で編集されます (つまり、変更は stdout に出力されるのではなく、ファイルに反映されます)。

sedPOSIX準拠のOSであればどれでも利用可能であり、perlおそらく以下のOSを除くほとんどの最新のUnixでも利用可能である。努力を重ねてきたそれを削除することです。

答え3

awk文字列「foo」を先頭に追加する解決策を紹介します。

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

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

{ 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

関連情報