Unix环境下移除XML中ID属性的sed命令修正求助
用sed移除XML中所有Id属性的正确命令
我来帮你修正sed命令!你要移除XML里所有的Id属性,之前的命令没达到预期是因为匹配规则没写对,咱们来一步步解决:
原始XML内容
<State> <Resident Id="100"> <Name>Sample Name</Name> <PhoneNumber>1234567891</PhoneNumber> <EmailAddress>sample_name@example.com</EmailAddress> <Address> <StreetLine1>Street Line1</StreetLine1> <City>City Name</City> <StateCode>AE</StateCode> <PostalCode>12345</PostalCode> </Address> </Resident> <Resident Id="101"> <Name>Sample Name1</Name> <PhoneNumber>1234567891</PhoneNumber> <EmailAddress>sample_name1@example.com</EmailAddress> <Address> <StreetLine1>Current Address</StreetLine1> <City>Los Angeles</City> <StateCode>CA</StateCode> <PostalCode>56666</PostalCode> </Address> </Resident> <Resident Id="" /> </State>
你之前尝试的命令问题分析
sed -i 's/^(ID=".*)".*/\1>/' Resident.xml:这个正则用了^(行首匹配),但Id并不是在行首;而且匹配逻辑错误,没办法正确定位并移除Id属性。sed '/ ID.*/d' Resident.xml:这个命令会删除所有包含ID的整行,这显然不对,因为Resident标签后面还有子元素,不能删掉整行。
正确的sed命令
sed -i 's/\s*Id="[^"]*"//g' Resident.xml
命令解释:
\s*:匹配零个或多个空白字符(处理Id前面可能存在的空格)Id="[^"]*":精准匹配Id="开头,直到下一个双引号结束的内容(不管引号里是空还是有数字)//g:全局替换,把所有匹配到的Id属性替换为空(也就是移除)
执行后的期望结果
<State> <Resident> <Name>Sample Name</Name> <PhoneNumber>1234567891</PhoneNumber> <EmailAddress>sample_name@example.com</EmailAddress> <Address> <StreetLine1>Street Line1</StreetLine1> <City>City Name</City> <StateCode>AE</StateCode> <PostalCode>12345</PostalCode> </Address> </Resident> <Resident> <Name>Sample Name1</Name> <PhoneNumber>1234567891</PhoneNumber> <EmailAddress>sample_name1@example.com</EmailAddress> <Address> <StreetLine1>Current Address</StreetLine1> <City>Los Angeles</City> <StateCode>CA</StateCode> <PostalCode>56666</PostalCode> </Address> </Resident> <Resident /> </State>
内容的提问来源于stack exchange,提问作者Arvind Singh Kamlakar
相关产品推荐
相关产品推荐

