[英]sed substitution works on command line but not in sed script ;(
我正在嘗試使用正則表達式來大寫xml文件中的屬性。 attr是item_id =我要解析的行如下所示:
<Item acl_bits="0" active_seq="1" archive_date="" archive_info="" backup_date="" bom_view_tags="" configuration_object_tag="" creation_date="2007-09-12T20:28:24Z" date_released="" ead_paragraph="" elemId="id5017" fnd0InProcess="N" fnd0OriginalLocationCode="" fnd0RevisionId="" fnd0is_monolithic="" global_alt_list="" gov_classification="" has_variant_module="N" ip_classification="" is_configuration_item="N" is_vi="N" island_id="3517" item_id="SAN12542" last_mod_date="2007-09-12T20:30:59Z" last_mod_user="#id32" license_list="" lsd="" object_application="Teamcenter Engineering" object_desc="" object_name="C-rear_shell_intercostal_cutter" object_properties="0" object_type="Part-Ideas" owning_group="#id120" owning_organization="" owning_project="" owning_user="#id32" parent_uid="" pid="81" preferred_global_alt="" process_stage_list="" project_list="#id86" puid="2vHAAAxoxieWWC" release_status_list="" revision_limit="1" revision_number="0" timestamp="qSLAAAlkxieWWC" uom_tag="" wso_thread=""/>
是的,我知道這里有很多雜物……但是無論如何,我使用的sed命令看起來像這樣:
/ item_id / s / item_id =(\\ w *)/ item_id = \\ U \\ 1 / g
現在,如果我在cygwin Windows Shell中執行類似操作,這似乎可以正常工作:
echo is_configuration_item="N" is_vi="N" island_id="3281" item_id="AP2i4i_77" last_mod_date="2007-09-11T18:13:39Z" | sed -e 's/item_id=\(\w*\)/item_id=\"\U\1\"/g'
結果是:
等等等等item_id =“ AP2I4I_77”等等等等
但是,如果我在MacOS上嘗試此字符串,則該字符串也不會被替換...(更重要的是)當我嘗試這樣的sed命令腳本時(在cygwin shell中):
1,/ ^ END / {/ item_id / s / item_id =(\\ w *)/ item_id = \\ U \\ 1 / g}
我也不會將該字段大寫。
我完全糊塗了為什么這行不通...
我真的不在乎Mac的東西)(我只是為了完整性而提到它),但我需要我的sed腳本才能工作,因為我還在那兒做了很多其他替代工作(它們都可以工作)。
作為參考,這是我使用的完整的sedscript:
1,/^END/{
/item_id/s/item_id=\(\w*\)/item_id=\U\1/g
/item_revision_id/s/item_revision_id=\(\w*\)/item_revision_id=\U\1/g
/infodba/s/infodba,Project Administrator/mrslate,Project Administrator/g
/fred/s/fred,Project Administrator/mrslate,Project Administrator/g
/barney/s/barney,Project Administrator/mrslate,Project Administrator/g
/dino/s/dino,Project Administrator/mrslate,Project Administrator/g
/wilma/s/wilma,Project Administrator/mrslate,Project Administrator/g
s/role_name="Ceramics"/role_name="DesignEngineer"/g
s/role_name="Manager"/role_name="Management"/g
s/role_name="Document Control Temp"/role_name="DataManager"/g
s/role_name="Assembly Technician"/role_name="Viewer"/g
s/role_name="Document Control"/role_name="DataManager"/g
s/role_name="Analysis"/role_name="AnalysisEngineer"/g
s/role_name="Manufacturing"/role_name="MfgEngineer"/g
/barney/s/dba,barney,DBA/dba,mrslate,DBA/g
/wilma/s/dba,wilma,DBA/dba,mrslate,DBA/g
/fred/s/dba,fred,DBA/dba,mrslate,DBA/g
/betty/s/Engineering,betty,Designer/Design.Bedrock,Migrator,DesignEngineer/g
}
在http://www.grymoire.com/Unix/Sed.html#uh-4a上查看了Extended Regular Expressions
我注意到了-e
和-r
之間的區別
在cygwin上
$ sed --version
sed (GNU sed) 4.4
Packaged by Cygwin (4.4-1)
..
$ echo is_configuration_item="N" is_vi="N" island_id="3281" item_id="AP2i4i_77" last_mod_date="2007-09-11T18:13:39Z" > prova.txt
$ sed -r '1,/^END/{ /item_id/s/item_id=(\w*)/item_id=\U\1/g }' prova.txt
is_configuration_item=N is_vi=N island_id=3281 item_id=AP2I4I_77 last_mod_date=2007-09-11T18:13:39Z
而
$ sed -e '1,/^END/{ /item_id/s/item_id=(\w*)/item_id=\U\1/g }' prova.txt
sed: -e expression #1, char 50: invalid reference \1 on `s' command's RHS
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.