У меня есть файл с разделителями каналов с образцами строк, как показано ниже;

/u/chaintrk/bri/sh/picklist_autoprint.sh|-rwxrwxr-x|bdr|bdr|2665|Oct|23|14:04|3919089454
/u/chaintrk/bri/sh/generate_ct2020.pl|-rwxrwxr-x|bdr|bdr|15916|Oct|23|14:04|957147508

Есть ли способ, которым awk или sed могут преобразовать строки в вывод, как показано ниже, где канал между месяцем и датой был заменен пробелом?

/u/chaintrk/bri/sh/picklist_autoprint.sh|-rwxrwxr-x|bdr|bdr|2665|Oct 23|14:04|3919089454
/u/chaintrk/bri/sh/generate_ct2020.pl|-rwxrwxr-x|bdr|bdr|15916|Oct 23|14:04|957147508
0
Dren 28 Окт 2015 в 08:34

2 ответа

Лучший ответ

С GNU sed:

sed -E 's/(\|[A-Z][a-z]{2})\|([0-9]{1,2}\|)/\1 \2/' file

Выход:

/u/chaintrk/bri/sh/picklist_autoprint.sh|-rwxrwxr-x|bdr|bdr|2665|Oct 23|14:04|3919089454
/u/chaintrk/bri/sh/generate_ct2020.pl|-rwxrwxr-x|bdr|bdr|15916|Oct 23|14:04|957147508

Если вы хотите редактировать файл «на месте», добавьте в sed опцию -i.

0
Cyrus 28 Окт 2015 в 05:42

Да, можно изменить "|" с пробелом.
Настоящая проблема состоит в том, чтобы определить, какое из полей нужно изменить.

Всегда ли это 6-й и 7-й? Если да, то это работает:

awk -vFS='|' '{sub($6"|"$7,$6" "$7)}1' file

Те, у которых есть текст Upper-lower-lower, за которым следует 1 or 2 digits? Если да, то работает другое:

gawk '{c="[|]([[:upper:]][[:lower:]]{2})[|]([0-9]{1,2})[|]";print gensub(c,"|\\1 \\2|",1,$0)}' file
0
user2350426user2350426 28 Окт 2015 в 06:32