特定のパターンの後、ファイル内のテキストを置き換えようとしています。
たとえば、
内容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つのパターン間の動作の違いは、...が.*==
最後のパターンと一致し、...が最初の==
パターン==
と一致することです。なぜなら、その.*
部分は後に続く可能な限り長いテキストと一致するからです==
。