!existがある場合にのみ、sedとsedを使用して、特定の文字列で始まる行を個別に置き換えます。

!existがある場合にのみ、sedとsedを使用して、特定の文字列で始まる行を個別に置き換えます。

これは私がsedを使って達成したいのですが、これまではサイコロはありません。

sed '/^command=/ /\/opt\/home\/user/!s@/home/user/@/opt/home/user/@' authorized_keys

@はスラッシュを見やすくするために置き換えることを選択した面白い区切り文字です。

デフォルトでは、正規表現で実行したいことは次のとおりです。 「文字列:command =で始まるファイルのすべての行に文字列:/ opt / home / userがない場合は、/ opt / userを/ opt / home /に置き換えます。ユーザー」

理論的には、ifステートメント、grep、およびsedを使用してこれを実行できることを知っていますが、これは私にとってあまりエレガントには見えません。私はsedが1行の正規表現でこれを自分で実行できると確信していますが、私が試したすべての組み合わせは私にあらゆる種類の構文エラーを与えるようです。奇妙なことは、正規表現ステートメントだけを使用すると、代替ステートメントと組み合わせると構文エラーが発生せず、それらを結合しようとしたときにのみ問題が発生することです。

sedを使ってこれを行うよりエレガントな方法がある人はいますか?それとも、grepとsedの前のifステートメントがこれを行う最善の方法であると仮定するのは正しいですか?

答え1

ドンクリスティ提案エレガントなソリューションコメントには、教育目的でここに別のバリエーションがあります。

sed '/^command=/! b; \@/opt/home/user@! s@/home/user@/opt&@' authorized_keys

関連情報