私のファイル:
subnet 172.25.10.0 netmask 255.255.255.0 {
option domain-name-servers 172.25.10.9, 8.8.8.8;
default-lease-time 300;
max-lease-time 7500;
range dynamic-bootp 172.25.10.10 172.25.10.30 ;
option broadcast-address 172.25.10.255;
option routers 172.25.10.1;
option ip-forwarding off;
}
text part
各フィールドに別々の個別の項目が必要ですvalue part
。 (フィールドがわからず、各フィールドに空白がいくつあるかわかりません。値も同じです。)
私たちが気づいたように:
フィールド:
max-lease-time;(o space)
option domain-name-servers (1 space)
値:
300(o space)
172.25.10.10 172.25.10.30 ( 1 space)
私が望む出力は次のとおりです。
フィールド名を付けた変数に値を入力したいと思います。
domain-name-servers="172.25.10.9, 8.8.8.8"(eliminate `option`)
default-lease-time="300"
など。
awk
一部の値にはスペースがあるため機能しません。172.25.10.9, 8.8.8.8
私の目標を達成するために使用できますかgrep -o
?
ベストアンサー1
元のテキストに存在しないgrepを使用して置き換えることはできないと思います=
。ただし、grepバージョンがPCRE拡張をサポートしていると仮定すると、次のように名前と値のペアを分離できます。
grep -oP '(option |range )?\K(\S+) (.+?(?=;))'
代わりに、通常のPerlを代わりに使用できます。
perl -pe 's/(option |range )?(\S+) (.+?);/$2="$3"/' file
subnet 172.25.10.0 netmask 255.255.255.0 {
domain-name-servers="172.25.10.9, 8.8.8.8"
default-lease-time="300"
max-lease-time="7500"
dynamic-bootp="172.25.10.10 172.25.10.30 "
broadcast-address="172.25.10.255"
routers="172.25.10.1"
ip-forwarding="off"
}
[開始と終了行を何にしたいのか指定しなかったのでそのままにします。]
またはsedとほぼ同じです。
sed -E 's/(option |range )?([^[:space:]]{1,}) (.*);/\2="\3"/' file
どちらも表現を3で割ります。グループそれぞれによって
- 単一のスペースで構成または次のオプションの
options
文字列range
- 空でない文字の空でないシーケンス(後に空白がある)
- 0個以上の文字(次に
;
)
=
次に、2番目と3番目のグループをシンボルに置き換えて二重引用符を追加します。実際のアプリケーションでは、単一の[[:space:]]
スペースをゼロ以外のPOSIX文字シーケンス(つまりスペースおよび/またはタブ)に置き換えるなど、これらの式をより強力にする必要があります。
value
すべての場合にフィールドだけがスペースを含めることができると仮定します。フィールドname
(たとえばdefault-lease-time
)は、空白以外の文字で構成されていると想定されます。私はそうは思わない語彙状況を処理する方法両方フィールドには、引用符のないスペースを含めることができます。