Используя GNU sed
, вы можете сделать это как:
sed -Ee '
s/^/\n\n/
s/\n\n/&\n/;s/[[:blank:]]+/\n/3;s/(.*)\n\n(.*)\n(.*)\n/\1\3\n\n\2/
s|<_0:MsgUID>|\n|;s|</_0:MsgUID>|\n|;s/(.*)\n\n(.*)\n(.*)\n/\1 \3\n\n\2/
s|<LoginName>|\n|;s|</LoginName>|\n|;s/(.*)\n\n(.*)\n(.*)\n/\1 \3\n\n\2/
s|<_1:CustId>|\n|;s|</_1:CustId>|\n|;s/(.*)\n\n(.*)\n(.*)\n/\1 \3\n\n\2/
s/\n\n.*//
' log.file
\n\n
в начало строки. Все спички, найденные в строке, перебрасываются слева от этого маркера. 03 Jun 2017/13:51:32:553 20150103135132968917 Userid 12345678
Другой способ — использование регулярных выражений Perl:
perl -lne '$,=$";
print /^(?:\S+\s+){2}\S+|<(?:_0:MsgUID|LoginName|_1:CustId)>\K(?:.*?)(?=<)/g' log.file
Здесь мы устанавливаемOFS
$,
на $"
, что равно space
. Регулярное выражение perl /..../g
выведет все совпадения, отличные от -, в список, который затем будет разделен печатным пространством из-за уже установленного значения OFS.
Я до сих пор не знаю «почему», но я решил свою проблему, установив разрешение 612 x 792 -, и теперь команда lp для двусторонней печати работает.