特定の文字を置き換えますが()内にある場合は置き換えません。

特定の文字を置き換えますが()内にある場合は置き換えません。

ファイルを読みやすくする1行のコマンドを探しています。グループに属していない限り、すべての;文字をに変更したいと思います。これはファイアウォールにあるので、bashなどのみ使用できます。newline()

入力例:

ProductName: Threat Emulation; product_family: Threat; Destination: (countryname: United States; IP: 127.0.0.1; repetitions: 1) ; FileName: (file_name: myfile) ;

予想出力:

ProductName: Threat Emulation
product_family: Threat
Destination: (countryname: United States; IP: 127.0.0.1; repetitions: 1)
FileName: (file_name: myfile)

ベストアンサー1

sedの正規表現は少し混乱しますが、うまくいきます。

sed '
    :a                                                 #mark return point
    s/\(\(^\|)\)[^(]\+\);\s*\([^)]\+\((\|$\)\)/\1\n\3/ #remove ; between ) and (
    ta                                                 #repeat if substitute success
    s/[[:blank:];]\+$//                                #remove ; with spaces at end
    '

Breif正規表現の説明:

  • ^\|)線で始まる)
  • [^(]\+以外のすべての記号(
  • ;\s*空白ができるセミコロン
  • (\|$行が終わるまで、または(

おすすめ記事