sedを使用してテキストを置き換え、特定のパターンの後にテキストを追加する

sedを使用してテキストを置き換え、特定のパターンの後にテキストを追加する

特定のパターンの後、ファイル内のテキストを置き換えようとしています。

たとえば、

内容example.txt

Something==x.y.z

に変えたい

Something>=x.y.z,<x.y.z+1.0

sed -i 's/==/>=/g' example.txt変更に使用できることを知っていますが、特定のパターンの後に何を追加するのか==わかりません。<x.y.z+1.0

x.y.zランダム番号なので参考にしてください)

編集する:Pythonパッケージで動作します。はい

argcomplete==1.12.3
youtube-dl==2021.6.6
systemd-python==234

なります

argcomplete>=1.12.3,<1.12.3+1.0
youtube-dl>=2021.6.6,<2021.6.6+1.0
systemd-python>=234,<234+1.0

答え1

次のsedコマンドは、行に正確に1つしかないと仮定==し、その前後の部分を交換に使用できるグループ1とグループ2に抽出します。

sed 's/\(.*\)==\(.*\)/\1>=\2,<\2+1.0/'

入力あり

Something==x.y.z
argcomplete==1.12.3
youtube-dl==2021.6.6
systemd-python==234

出力は次のとおりです

Something>=x.y.z,<x.y.z+1.0
argcomplete>=1.12.3,<1.12.3+1.0
youtube-dl>=2021.6.6,<2021.6.6+1.0
systemd-python>=234,<234+1.0

ファイルをその場で編集するには、オプションを追加して-iファイル名を入力します。

sed -i 's/\(.*\)==\(.*\)/\1>=\2,<\2+1.0/' example.txt 

説明する:

パターン:

  • .=ランダムな文字
  • *= 前のパターンがゼロからランダムな数字まで繰り返されます。
  • --> .*= 任意数の文字
  • \(... \)= 埋め込みパターンに一致するテキストをキャプチャします。
  • ===テキスト
  • \(.*\)==\(.*\)=グループ1でキャプチャされたテキスト、その後に==グループ2でキャプチャされたテキスト

代替:

  • \1, \2= キャプチャグループ 1 または 2 のテキスト
  • ここの他の部分はすべてテキストです。
  • \1>=\2,<\2+1.0=グループ1 >= グループ2 ,< グループ2 +1.0

で述べたようにそれらコメントは==、最初のパターンの前のリテラルを省略できます。

sed 's/==\(.*\)/>=\1,<\1+1.0/'

説明は似ていますが、sed唯一の違いは、行の一致する部分が変更されることです。したがって、前の部分は==保存され、後の部分には==キャプチャグループのみが必要です。

2つのパターン間の動作の違いは、...が.*==最後のパターンと一致し、...が最初の==パターン==と一致することです。なぜなら、その.*部分は後に続く可能な限り長いテキストと一致するからです==

関連情報