この問題を解決するためにgrep、awk、およびsedを使用しています。次の行を含むXMLがあります。
<field type="float8" name="something" database_fieldname="SHORT" allowsnull="false"/>
<field type="float8" name="LONG" database_fieldname="LONG" allowsnull="false"/>
その値を持つ行を分離したいと思います。名前=そしてデータベースフィールド名=同じ場合は、フィールド全体を削除してください。データベースフィールド名=.予想出力:
<field type="float8" name="something" database_fieldname="SHORT" allowsnull="false"/>
<field type="float8" name="LONG" allowsnull="false"/>
答え1
awk
おおよその解決策:
awk '
{match ($0, / name="[^"]*"/)
R1 = RSTART
L1 = RLENGTH
match ($0, / database_fieldname="[^"]*"/)
R2 = RSTART
L2 = RLENGTH
if (substr ($0, R1+7, L1-8) == substr ($0, R2+21, L2-22)) sub (substr ($0, R2, L2), "")
}
1
' file
<field type="float8" name="something" database_fieldname="SHORT" allowsnull="false"/>
<field type="float8" name="LONG" allowsnull="false"/>
2つのターゲットフィールドを一致させ、対応する値を抽出し、比較し、等しい場合は、2番目のフィールドを空の文字列に完全に置き換えます。
答え2
検索パターンに逆参照を使用できます。
sed -e 's/name="\(.*\)" database_fieldname="\1"/name="\1"/' <input>