各行の先頭に文字列を追加する方法 (各行に同じ文字列) を探しています。カスタマイズ可能なものではなく、覚えやすく、すべての 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 に出力されるのではなく、ファイルに反映されます)。
sed
POSIX準拠の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