Подстановка sed работает в командной строке, но не в сценарии sed; ( - PullRequest
0 голосов
/ 29 сентября 2018

Я пытаюсь использовать регулярное выражение для добавления атрибута в XML-файл.Attr is 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:попробуйте это на MacOS, строка не подставляется ... также (и что более важно), когда я пытаюсь использовать скрипт команд sed, подобный этому (в оболочке cygwin):

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 голосов
/ 29 сентября 2018

После просмотра 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
...