web-dev-qa-db-ja.com

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

すべての行の先頭に文字列を追加する方法を探しています(すべての行に同じ文字列)。カスタマイズ可能なものではなく、覚えやすく、すべてのPOSIX準拠プラットフォーム(およびすべてのシェル)で利用できるもの。

8
syntagma

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で利用可能である必要があります。

8
Joseph R.
:|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} $_"'

よりよく機能します。

14

文字列「foo」を前に付けたawkを使用した解決策を示します。

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

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

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

ストリームツールを使用したインプレース編集の問題を回避するには、通常はインプレース編集を行うツール(エディター)を使用します。

ex sample.txt -c "%s/^/foo /" -c wq

コマンドが簡単で、1つの本当のエディタに精通している誰にとっても明白であるという追加の利点があります。

4
Mike DeAngelo

これを行うには、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
2
slm

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))

参照リンク

1
Rahul Patil