sed を使用して複数の連続行を 1 つに置き換えます。

sed を使用して複数の連続行を 1 つに置き換えます。

私はすべてのPythonスクリプトで2つの連続した行を置き換えたいと思います。

import matplotlib as mpl
mpl.style.use(mpl_plt_default_template)

この行を使用してください

plt.style.use(mpl_plt_default_template)

これまで私は見つけました去る連続した2行を各行に適用される式に置き換えますが、2行を1行に完全に置き換える方法は示していません。失敗したアプローチに関して、次のsed文字列を適用しました。

sed '/import matplotlib as mpl$/N;//s/mpl.style.use(mpl_plt_default_template)/plt.style.use(mpl_plt_default_template)/g'

ノート最初の行(import matplotlib as mpl)はファイル内の他の場所に表示されることもあります。そして変わらずに維持されなければならないしたがって、目標は、2つの行が与えられた順序で順番に発生する場合にのみ置換を実行することです。

編集内容には、次の追加範囲が含まれますfind

find最後の目標は、次のようなパイプを使用して、コマンドで見つかった複数のテキストファイルでこれらの2行を置き換えることです。

find /path/to/dir/ -type f -exec sed 'old-lines/s/single-new-line' {} \;

システムの詳細:

オペレーティングシステム: Lubuntu 20.04 LTS

答え1

ファイルを編集するには、次のスクリプト可能なテキストエディタを使用します。エドまたは前任者(どちらもPOSIXエディタです)。構文は非常に似ています。

printf '%s\n' '/^import matplotlib as mpl$/d' 's/mpl/plt' 'w' 'q' | ed -s file
printf '%s\n' '/^import matplotlib as mpl$/d' 's/mpl/plt' 'x' | ex file
  • printf '%s\n'エディタにコマンドを提供します。

  • /^import matplotlib as mpl$/dパターンに一致する最初の行を削除します。

  • s/mpl/plt次の行で交換を行います。

  • wおよびq/またはx変更を保存します。

本当にSedが欲しいなら、

sed '/^import matplotlib as mpl$/N; s/.*\nmpl/plt/' file

拡張の問題を解決するには:

find /path/to/dir/ -type f -exec sh -c '
    printf "%s\n" "/^import matplotlib as mpl\$/d" "s/mpl/plt" "w" "q" |
    ed -s "$1"' sh {} \;

答え2

必要でない場合は操作sedに使用できます。awk

awk '$0=="import matplotlib as mpl" {buf=$0; next}
     buf {if (/^mpl\.style\.use/) {sub(/^mpl/,"plt")} else {print buf}; buf=""} 1' inputfile
  • 正しい読み出し行に出会ったら、import matplotlib as mplそれをバッファに保存し、buf実行のために次の行にジャンプします。
  • バッファ変数が設定され、現在の行がで始まる場合は、mpl.style.use現在の行の対応する部分を置き換えてplt.style.useバッファの内容を削除します。
  • バッファ変数が設定されているが現在の行が「2行目」パターンと一致しない場合、現在の行が印刷される前にバッファの内容が印刷されます。その後、バッファがクリアされます。
  • バッファが空のときに出会うすべての行に対して、単に行をそのまま印刷します。

2 番目の行に対してより正確な一致が必要な場合は、2 番目のルールを次のように変更します。

buf {if ($0=="mpl.style.use(mpl_plt_default_template)" {sub(/^mpl/,"plt")} else {print buf}; buf=""}

関連情報