awk - не может указать FS - PullRequest
       23

awk - не может указать FS

2 голосов
/ 03 декабря 2009

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

Пример:

\fB\-\-author\fR

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


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

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

{
    print $2
}

Это вход

\ Fb-о \ Fp

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

Ответы [ 3 ]

2 голосов
/ 03 декабря 2009

Похоже, что вы можете сделать это с 4 обратными слешами:

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

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

0 голосов
/ 19 декабря 2009

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

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

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

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

0 голосов
/ 03 декабря 2009

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

/\\fB/ { ... process option ...}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...