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

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

ファイルを読みやすくする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*空白ができるセミコロン
  • (\|$行が終わるまで、または(

答え2

awk がある場合は、括弧をフィールド区切り文字として使用できます。

awk -F '[()]' '{
    for (i=1; i<=NF; i+=2) {
        if ($i) {
            gsub(/; */,"\n",$i)
            printf "%s", $i
            if ($(i+1)) printf "(%s)", $(i+1)
        }
    }
    print ""
}' <<END
ProductName: Threat Emulation; product_family: Threat; Destination: (countryname: United States; IP: 127.0.0.1; repetitions: 1) ; FileName: (file_name: myfile) ;
END
ProductName: Threat Emulation
product_family: Threat
Destination: (countryname: United States; IP: 127.0.0.1; repetitions: 1) 
FileName: (file_name: myfile) 

末尾のセミコロンは末尾の改行文字を提供します。

関連情報