2012-12-26 8 views

答えて

17

私はおそらく、この仕事のためにsedを使用したいです:

line=3 
sed -e "${line}r file2" file1 

file1を上書きし、GNU sedをお持ちの場合は、-iオプションを追加してください。それ以外の場合は、一時ファイルに書き込み、一時ファイルを元のファイルにコピー/移動して、必要に応じてクリーンアップします(下のtrap)。注:一時ファイルをファイルにコピーするとリンクが保持されます。移動はしません(しかし、特にファイルが大きい場合は速くなります)。

line=3 
tmp="./sed.$$" 
trap "rm -f $tmp; exit 1" 0 1 2 3 13 15 
sed -e "${line}r file2" file1 > $tmp 
cp $tmp file1 
rm -f $tmp 
trap 0 
+0

ありがとうm8、それはそれを行います! –

1
cat file1 >>file2 

はfile1の内容をfile2に追加します。

cat file1 file2 

は、file1とfile2を連結し、出力を端末に送信します。

cat file1 file2 >file3 

作成またはoverwite FILE3 FILE1の連結ととfile2

はFILE3の端部にfile1とFILE2の連結を追加しますます。

sed -e '11,$d' -i file2 && cat file1 >>file2 

または500行がファイル作るために:FILE1を追加する前に、ファイル2をトランキング

編集

n=$((500-$(wc -l <file1))) 
sed -e "1,${n}d" -i file2 && cat file1 >>file2 
+0

私がしたいのは、cat file1 >> file2ですが、file2の特定の行に "cat"です。 どうすればいいですか?あなたは私の一日を作ってくれます! –

+0

もちろん、私の最後のサンプルでは500行未満であるfile1! – techno

7

は、我々はすべてed愛する楽しみのためだけに、というだけの理由で、標準エディタは、ここにedバージョンです。非常に効率的です(ed本物のテキストエディタです)!

ed -s file2 <<< $'3r file1\nw' 

行番号は、変数lineに格納されている場合:

ed -s file2 <<< "${line}r file1"$'\nw' 

ただ、ザックを喜ばせるために、ここではあまりbashismとの1つのバージョンは、私は、あなたが(個人的にはbashを好きではない場合には、です

printf "%s\n" "${line}r file1" w | ed -s file2 

をか()Sorpigalを喜ばせるために:私はherestringsを好むが、ちょっと、私が言ったように、それは)ザックを喜ばせるだけだ、パイプやサブシェルを好きではない

printf "%dr %s\nw" "$line" file1 | ed -s file2 

(それは通常、最も効率的です)ジョナサン・レフラーはコメントで述べているように、あなたはスクリプトで、このメソッドを使用する場合は、ヒアドキュメントを使用します。

ed -s file2 <<EOF 
${line}r file1 
w 
EOF 

・ホープ、このことができます!

P.S.標準エディタedを運転する方法について自分自身を表明する必要があると感じる場合は、コメントを残すことをためらってください。

+0

これは賢いですが、同じ呼吸で 'ed'とbashismsを使用するものをアップアップすると、私は古いひげの状態を失います。 'printf '3r file1 \ nw' | ed -s file2'としてください。 – zwol

+0

それに応じて@Zackが編集されました。 ';-)' –

+0

'<<<'バッシュの代わりに古い形式の文書( '<< EOF')が動作します。 –

1

これを行う方法はたくさんありますが、ツールを作成する方法を選択するのが好きです。

まず、セットアップのテスト環境

rm -rf /tmp/test 
mkdir /tmp/test 
printf '%s\n' {0..9} > /tmp/test/f1 
printf '%s\n' {one,two,three,four,five,six,seven,eight,nine,ten} > /tmp/test/f2 

今のツールを作ってみましょう、この最初のパスで、私たちはひどくそれを実装します。

# insert contents of file $1 into file $2 at line $3 
insert_at() { insert="$1" ; into="$2" ; at="$3" ; { head -n $at "$into" ; ((at++)) ; cat "$insert" ; tail -n +$at "$into" ; } ; } 

次に、このツールを実行して素晴らしい結果を確認します。

$ insert_at /tmp/test/f1 /tmp/test/f2 5 

しかし、結果は標準出力にあります。オリジナルの上書きはどうですか?問題はない、我々はそれのための別のツールを作ることができます。

insert_at_replace() { tmp=$(mktemp) ; insert_at "[email protected]" > "$tmp" ; mv "$tmp" "$2" ; } 

そして、 "あなたの実装は吸う!"

$ insert_at_replace /tmp/test/f1 /tmp/test/f2 5 
$ cat /tmp/test/f2 

それを実行します

私は知っていますが、それは簡単なツールを作ることの美しさです。 insert_atをsedバージョンに置き換えましょう。

insert_at() { insert="$1" ; into="$2" ; at="$3" ; sed -e "${at}r ${insert}" "$into" ; } 

そしてinsert_at_replaceは(もちろん)動作し続けます。 insert_at_replaceの実装は、バグの少ないものに変更することもできますが、読者のための練習として残しておきます。

関連する問題