2012-11-27 9 views
13

私はイムは、各ラインに仕事「プレフィックスを」プレフィックスしようとしているが、代わりにこのエラーを取得しています..行ずつテキストファイルをループし、次のbashコードを持っている:ファイル内の各行の先頭に文字列を追加するにはどうすればよいですか?

[email protected]:~/Desktop$ ./appendToFile.sh stusers.txt kp 
stusers.txt 
kp 
./appendToFile.sh: line 11: /bin/sed: Argument list too long 
[email protected],passw0rd 

これはbashのですスクリプト..

#!/bin/bash 

file=$1 
string=$2 

echo "$file" 
echo "$string" 

for line in `cat $file` 
do 
    sed -e 's/^/prefix/' $line 
    echo "$line" 
done < $file 

私はここで間違っていますか?

更新: ファイルの先頭を実行すると、すべての行が端末の1行にダンプされます。

[email protected]:~/Desktop$ head stusers.txt 
[email protected]:~/Desktop$ ouse.com,passw0rd 
+2

おそらくファイルに無効な行末を持っています。おそらく 'dos2unix'が必要です –

+0

@WilliamPursellファイルに対してdos2unixを実行しようとしましたが、新しい行を挿入しませんでした。最も簡単な解決策はファイルの内容を新しいファイルにコピーすることです。 – bobbyrne01

答えて

28

1行のawkコマンドもトリックを行う必要があります。

awk '{print "prefix" $0}' file 
+1

シンプルな、それを愛する!私はこのコマンドの出力をファイルにリダイレクトしました。ありがとう! – bobbyrne01

3

代わりのループのために、while read...を使用することがより適切である:

while read -r line; do 
do 
    echo "$line" | sed -e 's/^/prefix/' 
done < $file 

しかし、あなたは単純でオフはるかに良いでしょう:

sed -e 's/^/prefix/' $file 
+0

最初のコードブロックが新しいプレフィックス2番目のブロックは、ファイルの最初の行を更新しました – bobbyrne01

3

A Perlの道へそれはでしょうか:

perl -p -e's/^/prefix' filename 

またはfilenameから読み取り、STDOUTにプレフィックス線を印刷し、いずれの場合において

perl -p -e'$_ = "prefix $_"' filename 

-iフラグを追加すると、Perlはそのファイルを修正します。複数のファイル名を指定することもでき、Perlはすべてのファイル名を魔法のように実行します。

0

をあなただけのそれぞれの上にechoコマンド内の文字列

while IFS= read -r line; do 
    echo "prefix$line" 
done < filename 

あなたのループが反復を連結、sedの必要はありません。ファイル内単語

for line in `cat file`; ... 
9

についてはY私たちの元のエラー:

./appendToFile.sh: line 11: /bin/sed: Argument list too long

問題のコード行を使用することです:このコンテキストで

sed -e 's/^/prefix/' $line

$ラインはに対して実行されているsedのことファイル名です。あなたのコードを修正するには次のような行を修正する必要があります。

echo $line | sed -e 's/^/prefex/'

(また、あなたの元のコードは最後に< $fileを持つべきではないことに注意してください。)

William Pursellは、この問題を両方の提案で正しく解決しています。

ただし、元のテキストファイルに問題があることを正しく認識していると思います。 dos2unixは、この問題を修正しません。これは、行の末尾にWindowsがスティックするキャリッジリターンのみを取り除くためです。 (ただし、WindowsでLinuxファイルを読み込もうとした場合、返品のない巨大な行が得られます)。

テキストファイルの行末文字に問題がないと仮定すると、William Pursell's 、Andy Lester's、またはnullrevolutionの答えが働きます。

while read...提案のバリエーション:

while read -r line; do echo "kp" $line; done < stusers.txt

+1

1)フィールドスプリットをオフにして、先頭と後ろの空白を取り除きます.2)多くの理由で変数を引用します: 'IFS = read -r line; echo "kp" "$ line"; done

6

全体:これはシェル(バッチ/スクリプトファイルは必要ありません)から直接実行することができ

while read -r line; do echo "PREFIX " $line; done < $file

ループは、ファイル全体で動作する単一のsedコマンドで置き換えることができます。

sed -e 's/^/prefix/' $file 
+1

ラインが空であるかどうかチェックすることは可能ですか? –

+0

空の行を空のままにしますか? – Jack

+1

これはずっと前です...両方のオプションを知っておくといいでしょう –

0

sedを使用します。ただprefixという単語を変更してください。

sed -e 's/^/prefix/' file.ext 

あなたは別のファイルに出力を保存したい場合は

sed -e 's/^/prefix/' file.ext > file_new.ext 
関連する問題