ファイルを読みやすくする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)
末尾のセミコロンは末尾の改行文字を提供します。