簡體   English   中英

sed替換在命令行上有效,但在sed腳本中無效;(

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM