行番号を事前に知って別のファイルに保存します。
cat linenos
2
15
42
44
... etc
ご覧のとおり、行が隣接していないため、rangeは使用できませんsed
。目標は、ターゲットファイルの行を変更することです。たとえば、ターゲットファイル行の前にMARKERなどのマーカーを追加します。
sed
簡単なアプローチは、各行を変更するために複数回呼び出すことです。
for l in $(cat linenos)
do
sed -i "${l}s/^/MARKER/" target_file
done
これは明らかにsedを何度も呼び出すでしょう。
警告する:*このアプローチは非効率的であるだけでなく、そのようなマークアップを挿入しない修正がある場合にも問題が発生する可能性があります。 sedコマンド(darなど)で行を削除または挿入すると、ループ内の次のsed実行のためにlinenosの最初の行番号が無効になります。
改善/最適化をどのように提案しますか?
例 linenos ファイル
cat linenos
2
5
サンプルオブジェクトファイル
cat target_file
line one
line two
line three
line four
line five
line six
修正されたtarget_fileの期待される結果
cat target_file
line one
MARKERline two
line three
line four
MARKERline five
line six
私が考えた可能な方法は、sedシーンを動的に生成することです。
SEDCMD=$(for l in $(cat linenos); do echo -n "${l}s/^/MARK/;" ; done)
sed -i -e "$SEDCMD" targetfile
@スチールドライバ次のような方法はアイデアと同じですが、よりエレガントで簡潔です。
ベストアンサー1
sed自体(または他の選択したテキスト処理ユーティリティ)を使用して行番号をsed式に変換し、スイッチを使用して-f
sedに渡すことができます。
前任者。
sed 's:$:s/^/MARKER/:' linenos | sed -f- -i target_file
これは少なくともsedのみを呼び出します。二重。