Использование строки из нескольких символов в качестве разделителя в awk

У меня есть текстовый файл, в котором записи имеют следующий формат:

А||о||BCD||о||Е||о||XYZ

Я хочу использовать '||о||' в качестве разделителя для получения моих записей:

Но когда я использую:

awk -F'||o||' '{print $1}'

Я получаю следующую ошибку:

awk: неправильный первичный в регулярном выражении ||o|| в |о||

Любая помощь будет высоко ценится.


person Bhawan    schedule 22.02.2018    source источник
comment
связанные: stackoverflow.com/questions/48828159/ ... тот же разделитель;)   -  person Sundeep    schedule 22.02.2018
comment
Я не получаю ошибку с GNU awk .. поэтому предлагаю добавить версию awk к вашему вопросу   -  person Sundeep    schedule 22.02.2018
comment
Откуда берутся эти файлы, которые используют ||o|| в качестве разделителя??? Я постоянно вижу их упоминания на этом форуме.   -  person Ed Morton    schedule 22.02.2018


Ответы (1)


вам нужно избегать буквальных каналов в регулярном выражении

awk -F'[|][|]o[|][|]' '{print $1}'

or

awk -F'[|]{2,2}o[|]{2,2}' '{print $1}'

Обычное экранирование обратной косой черты в awk отличается, поэтому использовать его (по крайней мере, на GNU bash, версия 4.3.42)

awk 'BEGIN{FS="\\|\\|o\\|\\|"} {print $1}' pipe.txt

а также этот уродливый синтаксис с использованием опции -F

awk -F "\\\|\\\|o\\\|\\\|" '{print $1}' pipe.txt

Двойные побеги хорошо описаны здесь.

person LMC    schedule 22.02.2018
comment
Луис, в моей системе awk -F'\|\|o\|\|' '{print $1}' не работает, а awk -F'[|][|]o[|][|]' '{print $1}' и awk -F'[|]{2,2}o[|]{2,2}' '{print $1}' работают. Если вы уберете первое, я поддержу ваше решение. - person Pierre François; 22.02.2018
comment
@Luis Muñoz: я позволил себе удалить ваше первое решение, которое не работает, но оставил второе и третье. - person Pierre François; 22.02.2018
comment
Большое спасибо. Я добавил больше информации об этом в конце ответа. - person LMC; 22.02.2018
comment
@Luis Muñoz: Ха-сидо и россыпь. - person Pierre François; 22.02.2018