我有一个文件
仪器.xml
bash-4.1$ more instrument.xml
<instr instr_id="CPT-2380950-011-001-826" valor_ch="" instr_type="CurrentAccount" instr_name="CPT-2380950-011-001-826" qn_type="1" ccy_code="GBP" cnt_code="CH" date_issue="2002-05-29 00:00:00" int_rate="0.08000000" eusd_scope="0" cmnt="CRD" status="1"/>
<instr instr_id="VAL-0000001-000" isin="0000001-000 " valor_ch="0000001-000" instr_type="Share" instr_name="******ON" qn_type="1" ccy_code="999" cnt_code="XX" int_rate="0.00000000" eusd_scope="0" cmnt="200" status="1"/>
<instr instr_id="CPT-2411550-011-000-826" valor_ch="" instr_type="CurrentAccount" instr_name="CPT-2411550-011-000-826" qn_type="1" ccy_code="GBP" cnt_code="CH" date_issue="2002-08-02 00:00:00" int_rate="0.08000000" eusd_scope="0" cmnt="CRD" status="1"/>
要求:我需要将文件中任何位置的[日期时间]例如2002-05-29 00:00:00更改为[dateTtime]例如2002-05-29T00:00:00。 --有些行中不会有日期,所以我需要搜索日期模式,然后进行更改 --并且列的长度各不相同 sed 13 是寻找第 13 个空格的非常业余的尝试(请忽略)
我徒劳的尝试:
sed "s/[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]/&T/" instrument.xml
grep "[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]" test.xml | sed 's/ //13' >instrument.xml ( it doesn’t give me all )
sed "s/[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]/&T~+/" instrument.xml | tr "~" "\n" | sed 's/^+./+/g' ( unable to join only lines which have + in them)
答案1
sed "s/\($(printf "[0-9][0-9]%s" '' - - '\) \(' : : '')\)/\1T\2/g"
也许尝试以编程方式构建您的模式。有时这可以更容易地确定非常具体的类型。
上面的内容扩展为...
sed 's/\([0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]\) \([0-9][0-9]:[0-9][0-9]:[0-9][0-9]\)/\1T\2/g'
(但没有单引号)