cat
で処理しようとしたが、2番目のファイルを入力した後に| head -$line | tail -1
を追加したが、最初にcat
を実行しているためです。ファイルの内容を別のファイル(送信されたファイルの特定の行に)に挿入する-BASH/LINUX
アイデア?私はcat
または何か他のものでそれをする必要があります。
cat
で処理しようとしたが、2番目のファイルを入力した後に| head -$line | tail -1
を追加したが、最初にcat
を実行しているためです。ファイルの内容を別のファイル(送信されたファイルの特定の行に)に挿入する-BASH/LINUX
アイデア?私はcat
または何か他のものでそれをする必要があります。
私はおそらく、この仕事のために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
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
私がしたいのは、cat file1 >> file2ですが、file2の特定の行に "cat"です。 どうすればいいですか?あなたは私の一日を作ってくれます! –
もちろん、私の最後のサンプルでは500行未満であるfile1! – techno
は、我々はすべて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
を運転する方法について自分自身を表明する必要があると感じる場合は、コメントを残すことをためらってください。
これは賢いですが、同じ呼吸で 'ed'とbashismsを使用するものをアップアップすると、私は古いひげの状態を失います。 'printf '3r file1 \ nw' | ed -s file2'としてください。 – zwol
それに応じて@Zackが編集されました。 ';-)' –
'<<<'バッシュの代わりに古い形式の文書( '<< EOF')が動作します。 –
これを行う方法はたくさんありますが、ツールを作成する方法を選択するのが好きです。
まず、セットアップのテスト環境
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
の実装は、バグの少ないものに変更することもできますが、読者のための練習として残しておきます。
ありがとうm8、それはそれを行います! –