
как объединить приведенные ниже команды sed в Linux
sed -rn 's/.*MsgFlow="([^"]*)".*/\1/p' ADVQCC_OUTPUT_BRK1
и
sed -n 's:.*<ProcessDtm>\(.*\)</ProcessDtm>.*:\1:p' ADVQCC_OUTPUT_BRK1
Спасибо
решение1
Обычно можно просто объединить sed
команды, например, несколько s
команд, со встроенной точкой с запятой:
sed 's/some/another/;s/stuff/thing/'
В вашем случае одна команда используетрасширенные регулярные выражения(ЭРЭ), другойосновные регулярные выражения, поэтому вам нужно преобразовать одно или другое:
sed -n 's/.*MsgFlow="\([^"]*\)".*/\1/p;s:.*<ProcessDtm>\(.*\)</ProcessDtm>.*:\1:p' ADVQCC_OUTPUT_BRK1
или с ЭРЭ:
sed -En 's/.*MsgFlow="([^"]*)".*/\1/p;s:.*<ProcessDtm>(.*)</ProcessDtm>.*:\1:p' ADVQCC_OUTPUT_BRK1
Примечание: Я изменил -r
на -E
для выбора ERE, потому что это понимают больше версий sed
.
решение2
Я думаю, что более близким вариантом комбинации двух команд будет (POSIXly):
sed -ne 's/.*MsgFlow=\"\([^"]*\)\".*/\1/p' -ne 's/.*<ProcessDtm>\\\(.*\\\)<\/ProcessDtm>.*/\1/p' ADVQCC_OUTPUT_BRK1
Или проще говоря:
sed -e 's/.*MsgFlow=\"\([^"]*\)\".*/\1/' -e 's/.*<ProcessDtm>\\\(.*\\\)<\/ProcessDtm>.*/\1/' ADVQCC_OUTPUT_BRK1
Но мне нужен пример входных данных, чтобы получить более точный результат.