我正在用 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
您可以在搜索模式中使用反向引用:
sed -e 's/name="\(.*\)" database_fieldname="\1"/name="\1"/' <input>