回答:
使用できますsed
:
sed -i 's/^/your_string /' your_file
ステファンとマルコのコメントのおかげで、-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
で利用可能であり、おそらくそれを削除する努力を経たものを除いて、ほとんどの最近のUnicesで利用可能でなければなりません。
sed -i
POSIXではありません。それはGNUです。FreeBSD sed
にも同様のオプションがありますが、必要sed -i ''
です。
-i
一時的なコピーが作成されることを知っています(そのため、変更が元のファイルに反映されると言いました)。つまり、インプレース置換と同じセマンティクスが得られるということです。更新された回答がPOSIX準拠であることを確認してください。
$$
(現在のシェルのプロセスID)を一時ファイル名の一部としてよく使用します。それは保証された固有の名前を考えて毎回の努力を回避:command filename > filename.$$ && mv filename.$$ filename
:|paste -d'foo ' - - - - input > output
(冗談ですが、おそらくここに掲載されているすべてのソリューションの中で最速です:-b)。
正規の方法は次のとおりです。
sed 's/^/foo /' < input > output
ただし、任意の文字列に簡単に適合させることはできません。例えば、
sed "s/^/$var /"
場合にのみ機能し$var
、含まれていない&
、\
、/
も改行文字。
その点で、
export var
awk '{print ENVIRON["var"], $0}'
または
perl -pe '$_="$ENV{var} $_"'
うまくいくでしょう。
awk
文字列「foo」を先頭に追加して解決策を提示します。
awk '{ print "foo", $0; }' input > output
awk
クロスプラットフォームであり、どのPOSIXシステムでも利用できます。インプレース編集は行いません。2番目のファイルを作成せずにファイルを編集する場合は、一時ファイルを使用する必要があります。ジョセフのsed
答えを見てください、それは構文を示しています。別のハックは次の構文を使用することです。これは基本的に、元のファイルと同じファイル名で一時ファイルを作成することです。
{ rm file; awk '{ print "foo", $0 }' > file; } < file
reducto# wc -l foo
`914 foo` reducto# { rm foo ; awk '{ print "prepend" , $0 }' > foo } < foo
>
これは動作しないようです。オリジナルへのリダイレクトが緊張したので試してみましたが、起動しません。
ストリームツールを使用したインプレース編集の問題を回避するには、通常はインプレース編集を行うツール(エディター)を使用します。
ex sample.txt -c "%s/^/foo /" -c wq
コマンドが簡単で、1つの本当のエディタに精通している誰にとっても明白であるという追加の利点があります。
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
sed
方法を示しています。Perlの使用方法を示しました。問題についての聖なる戦争を探していません。
単にBashを使用する
while IFS= read -r line; do echo "foo" "${line}" ; done < input > Output
Pythonの使用
python -c "import sys; print 'foo '.join([ l for l in sys.stdin.readlines() ])" < input > Output
その場で編集したい場合
import fileinput
import sys
for line in fileinput.input(['inputfile'], inplace=True):
sys.stdout.write('foo {l}'.format(l=line))
awk
非常に小さなファイルよりも速く動作します。動作はエコーの実装によって異なり、先頭と末尾の空白を取り除き、バックスラッシュを特別に処理します。
prefix () { while IFS= read -r REPLY; do printf "%s%s\n" "$1" "$REPLY"; done; }
より正しいはずです。
{}
?@Mattはそれを名前付き関数にすることを提案していたと思いますが{}
、関数名がないことの意味は何ですか?
または、以下を実行できます。
vi filename.txt
Esc(NORMAL
モードであることを確認するため)、次のコマンドを入力します。
:1,$ s/^/mystring
1,$
単にで置き換えることができることに注意してください%
。これはコマンドになり:%s/^/string/
ます。
-i
スイッチはファイルを編集しません。新しいファイルを作成し、完了後に元のファイルを上書きします(証明:iノードの変更)。実際にインプレース編集を行うツールは多くありません。これは危険な操作です。さらに、POSIXについて言及しているため、-i
スイッチはPOSIX互換sed
では必須ではなく、特定の実装の機能の1つです。