sed替换在命令行上有效,但在sed脚本中无效;(

时间:2018-09-29 03:07:08

标签: regex bash sed cygwin

我正在尝试使用正则表达式来大写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
}

1 个答案:

答案 0 :(得分:0)

浏览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
相关问题