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


8

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

回答:


8

使用できます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に出力されるのではなく、ファイルに反映されます)。

sedPOSIX準拠のOS perlで利用可能であり、おそらくそれを削除する努力経たものを除いて、ほとんどの最近のUnicesで利用可能でなければなりません。


1
小さな修正:-iスイッチはファイルを編集しません。新しいファイルを作成し、完了後に元のファイルを上書きします(証明:iノードの変更)。実際にインプレース編集を行うツールは多くありません。これは危険な操作です。さらに、POSIXについて言及しているため、-iスイッチはPOSIX互換sedでは必須ではなく、特定の実装の機能の1つです。
Marco

2
sed -iPOSIXではありません。それはGNUです。FreeBSD sedにも同様のオプションがありますが、必要sed -i ''です。
ステファンChazelas

@Marco -i一時的なコピーが作成されることを知っています(そのため、変更が元のファイルに反映されると言いました)。つまり、インプレース置換と同じセマンティクスが得られるということです。更新された回答がPOSIX準拠であることを確認してください。
ジョセフR.

厳密に言うと、変更は元のファイルと同じ名前の新しいファイルに反映されます。
キース・トンプソン

1
$$(現在のシェルのプロセスID)を一時ファイル名の一部としてよく使用します。それは保証された固有の名前を考えて毎回の努力を回避:command filename > filename.$$ && mv filename.$$ filename
キース・トンプソン

14
:|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} $_"'

うまくいくでしょう。


それは興味深いものです...:P
Rahul Patil 2013年

4

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 >これは動作しないようです。オリジナルへのリダイレクトが緊張したので試してみましたが、起動しません。
kurtm 2013年

1
この例は、中括弧ではなく外側に括弧を使用する場合に機能します。
kurtm 2013年

4

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

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

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


2

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

Perlは今日では普遍的なもののようですが、長い間そうではありませんでした。そして、perlをベースの一部として使用することを断固として拒否している珍しいUNIXの変種がいくつかあると私は思っています。知っておくべきこと。
kurtm 2013年

@kurtm ここでの議論を参照してください。どうやら、AIXにはデフォルトでPerlがなく、組み込みシステムもありません。
terdon

2
@DavidSainty-それは十分に普遍的です。QにはBashのタグが付いているので、BashはあるがPerlはないシステムを想像するのは非常に困難です。とにかく、ここに5つの答えの1つがあります。他のいくつかは使用sed方法を示しています。Perlの使用方法を示しました。問題についての聖なる戦争を探していません。
slm

1
@DavidSaintyどうやらOpenBSDのみ。Openの人々は基本的に許すものについて保守的である傾向があるので、私は推測をしたと思います。OpenBSDは間違いなくそれをベースにしています。
kurtm 2013年

1
@slm:「BashはあるがPerlはないシステムを想像するのは非常に難しい」そのようなシステムをいくつか机の上に置いています。(たまたま組み込みシステムです。)
キース・トンプソン

1

単に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よりも速く動作するのですか?
Rahul Patil 2013年

1
awk非常に小さなファイルよりも速く動作します。動作はエコーの実装によって異なり、先頭と末尾の空白を取り除き、バックスラッシュを特別に処理します。
ステファンChazelas

@StephaneChazelasはい。100%正解です。テストしたばかりです... paste.ubuntu.com/6210934
Rahul Patil

prefix () { while IFS= read -r REPLY; do printf "%s%s\n" "$1" "$REPLY"; done; }より正しいはずです。
マット

1
なぜ{}?@Mattはそれを名前付き関数にすることを提案していたと思いますが{}、関数名がないことの意味は何ですか?
terdon

-1

または、以下を実行できます。

vi filename.txt

EscNORMALモードであることを確認するため)、次のコマンドを入力します。

:1,$ s/^/mystring

ユーザーがファイルのすべての行について尋ねているので、1,$ 単にで置き換えることができることに注意してください%。これはコマンドになり:%s/^/string/ます。
HalosGhost 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.