すべての行の先頭に文字列を追加する方法を探しています(すべての行に同じ文字列)。カスタマイズ可能なものではなく、覚えやすく、すべてのPOSIX準拠プラットフォーム(およびすべてのシェル)で利用できるもの。
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で利用可能である必要があります。
:|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} $_"'
よりよく機能します。
文字列「foo」を前に付けたawk
を使用した解決策を示します。
awk '{ print "foo", $0; }' input > output
awk
はクロスプラットフォームであり、どのPOSIXシステムでも使用できます。インプレース編集は行いません。 2番目のファイルを作成せずにファイルを編集する場合は、一時ファイルを使用する必要があります。 Josephのsed
回答を参照してください。構文が表示されます。別のハックは次の構文を使用することです。これは基本的に元のファイルと同じファイル名で一時ファイルを作成することです。
{ rm file; awk '{ print "foo", $0 }' > file; } < file
ストリームツールを使用したインプレース編集の問題を回避するには、通常はインプレース編集を行うツール(エディター)を使用します。
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
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))