これはあなたのために働くかもしれません:
echo "afs=1;bgd=1;cgd=1;djh=1;fgjhh=1;" |
sed 's/^/\n/;:a;/\n\(djh=[0-9]*\);/s//\1,\n/;ta;s/\n\([^=]*\)=1;/\1,\n/;ta;s/.$//'
afs,bgd,cgd,djh=1,fgjhh,
説明:
この方法では、入力文字列全体を比較するためのアンカーとして、一意のマーカー(\n
sedが行区切り文字として使用するためパターンスペースに表示できないため、適切な選択です)を使用します。低速ですが、複数の例外が必要な場合は拡張できます。
- 文字列の前にマーカーを配置します
s/^/\n/
- ループラベルに名前を付ける
:a
- 例外に一致する
/\n\(djh=[0-9]*\)/
- 例外が発生した場合は、必要に応じて置き換えてください。また、マーカーを ぶつけます
/s//\1,\n/
- 上記が真の場合、ループラベルへのブレーク
ta
- 通常と一致し、代用します。また、マーカーをぶつけます
s/\n\([^=]*\)=1;/\1,\n/
- 上記が真の場合、ループラベルへのブレーク
ta
- すべて完了してマーカーを削除します
s/.$//
また:
echo "afs=1;bgd=1;cgd=1;djh=1;fgjhh=1;" |
sed 's/\<djh=/\n/g;s/=[^;]*;/,/g;s/\n\([^;]*\);/djh=\1,/g'
afs,bgd,cgd,djh=1,fgjhh,
説明:
これは高速ですが、複数の例外に対応できません。
- グローバルに例外文字列を新しい行に置き換えます
s/\<djh=/\n/g
- グローバルに通常の状態を置き換えます
s/=[^;]*;/,/g
\n
グローバルに例外文字列に置き換えますs/\n\([^;]*\);/djh=\1,/g
注意:例外文字列を置き換えるときは、単語の境界で始まることを確認してください\<