awk - не удалось указать ФС

Я обрабатываю справочную страницу в формате nroff с помощью awk, чтобы извлечь параметры для каждой команды... Я понял, что параметры начинаются с \fB, за которыми следует фактическая опция, и, возможно, \fP и аргументы опции и так далее...

Пример:

\fB\-\-author\fR

Начал писать awk-скрипт, указав FS = "\fB"... ну не получилось... Пробовал экранировать \, переходя на FS = "\\fB" но тоже не получилось... что я делаю не так?


Это мой сценарий:

BEGIN {
    FS = "\\f." # "\\\\f." didn't work either
}

{
    print $2
}

это ввод

\fB-o\fP

Где я хочу, чтобы 2 доллара были -o. Но это просто не сработает.


awk
person Trollhorn    schedule 03.12.2009    source источник


Ответы (3)


Похоже, вы можете сделать это с помощью 4 обратных косых черт:

$ echo "1\z2\z3" | awk 'BEGIN { FS = "\\\\z" } ; {print $3 $1}'
31

Когда bash анализирует это, он должен преобразовать 4 обратных косых черты в 2 буквальных обратных слэша; тогда awk удалит эти две обратные косые черты в одну буквальную обратную косую черту.

person Mark Rushakoff    schedule 03.12.2009
comment
Правильно, вам нужно экранировать обратную косую черту дважды, так как кавычки () удаляют один экран. - person Aaron Digulla; 03.12.2009

Разделитель полей FS предназначен для данных в формате CSV. В вашем случае найдите параметры фильтра, а затем удалите ненужные части:

/\\fB/ { ... process option ...}
person Aaron Digulla    schedule 03.12.2009
comment
Выбор правильной линии — это только часть истории. Получение интересного поля - это то, чего хочет ОП. - person ; 03.12.2009

Кажется, я помню, как столкнулся с этим однажды.

Настоящая проблема заключалась в том, что некоторые версии awk настаивают на том, чтобы FS был одним символом.

Способ обойти это, насколько я помню, заключался в том, чтобы вручную загрузить файл в GNU Emacs, отредактировать многосимвольную FS до одного символа, который больше нигде в файле не использовался, выполнить awk с соответствующей FS, а затем вручную восстановить его. .

Вы МОЖЕТЕ автоматизировать это с помощью пары сценариев sed, один для начальной перекодировки, а другой для ее восстановления с шагом awk посередине.

person John R. Strohm    schedule 19.12.2009