1

私はこのような入力ストリームを持っています:

afs=1;bgd=1;cgd=1;djh=1;fgjhh=1;

今、私がストリームを編集しなければならないルールは次のとおりです:(1)

"djh=number;"

に置き換えます

"djh=number,"

(2)それ以外の場合は、「string=number;」を次のように置き換えます。

"string,"

ケース2は次のように処理できます。

sed 's/afs=1/afs,/g;s/dbg=1/dbg,/g;..... so on for rest

状態1の世話をする方法は?

「djh」番号は任意の番号(1,12,100)にすることができ、他の番号は常に1です。

私が使用したすべての二重引用符は参照用です。入力ストリームに二重引用符はありません。「afs」は「Afs」にすることもできます。前もって感謝します。

4

3 に答える 3

1
sed -e 's/;/,/g; s/,djh=/,@=/; s/\([a-z][a-z]*\)=[0-9]*,/\1,/g; s/@/djh/g'

これは次のことを行います

  1. ;すべてをに置き換えます,
  2. djhに置き換える@
  3. =numberすべての小文字の文字列から削除します
  4. @に置き換えるdjh

これにより、afs,bgd,cgd,djh=1,fgjhh,入力が可能になります。もちろん、djhを他の文字列に簡単に一致させる他の文字に置き換えることもできます。これは単にアイデアを説明しているだけです。

于 2012-05-17T12:01:16.187 に答える
0

これはあなたのために働くかもしれません:

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,

説明:

この方法では、入力文字列全体を比較するためのアンカーとして、一意のマーカー(\nsedが行区切り文字として使用するためパターンスペースに表示できないため、適切な選択です)を使用します。低速ですが、複数の例外が必要な場合は拡張できます。

  • 文字列の前にマーカーを配置します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

注意:例外文字列を置き換えるときは、単語の境界で始まることを確認してください\<

于 2012-05-17T12:01:34.657 に答える
0
echo 'afs=1;bgd=1;cgd=1;djh=1;fgjhh=1;' | 
sed -e 's/\(djh=[0-9]\+\);/\1,/g' -e 's/\([a-zA-Z0-9]\+\)=1;/\1,/g'
于 2012-05-17T12:01:35.453 に答える