awk -пустой разделитель записей :"RS=" vs "RS='|'" vs "RS= (| )"

Для общего экспорта добавьте эту строку в верхний make-файл

SHELL:=NODE_PATH=. ${SHELL}

где "УЗЕЛ _ПУТЬ=." пример var

Я использую это в этом примере проекта:

https://github.com/rzr/webthing-iotjs/blob/sandbox/rzr/node/master/Makefile#L24

4
06.01.2021, 15:13
1 ответ

По определениюRS='|'является литералом |. Любой одиночный символ RS рассматривается как литерал для переносимости между всеми awk, в противном случае у вас был бы сценарий с RS='|', который вел бы себя по-разному в gawk по сравнению с awk POSIX. Таким образом, односимвольный RS является литералом, в то время как строка с несколькими символами -в качестве RS является регулярным выражением, если версия awk поддерживает его, в противном случае это буквально просто первый символ строки (, поэтому RS='.'всегда является литералом ., а RS='.x'— это любой char, за которым следует xв некоторых awks и литерал .в других ).

Между прочим, в любом другом контексте регулярных выражений одиночное |является неопределенным поведением для POSIX, но многие инструменты будут рассматривать его как литерал |, и то же самое касается символов повторения регулярных выражений, таких как *и ?.

Что касается RS='(|)'-, это означает «null or null», что совпадает с «null», который вы могли бы альтернативно записать как (). Похоже, это подходит для всех персонажей, я не знаю, почему это не так. Различные инструменты, по-видимому, по-разному распознают это регулярное выражение :

.
$ printf 'foo\n' | sed -E 's/()/x/g'
xfxoxox
$ printf 'foo\n' | grep -Eo '()'
$
$ printf 'foo\n' | awk '{gsub(/()/,"x")} 1'
xfxoxox
$ printf 'foo\n' | awk -v RS='()' -v ORS='x\n' '1'
foox

Я связался с разработчиками GNU Awk (см.https://lists.gnu.org/archive/html/bug-gawk/2021-01/msg00003.html)и из этого получилось 2 вещи:

  1. Вы не должны использовать многократное -символьное регулярное выражение, которое соответствует нулевой строке, в качестве разделителя записей или в качестве разделителя полей. Если вы это сделаете, это будет обработано, если RS или FS не существует, и вы получите одну запись для всего ввода (для RS )или одно поле для всей записи (для FS ). Это будет явно указано в будущем выпуске руководства по gawk.
  2. В gawk 5.1.0 есть ошибка (, может быть, и раньше, я не знаю ), из-за которой завершающий символ потребляется, когда указанное выше выражение игнорируется. Для этого уже написано исправление, которое будет в будущей версии gawk.
8
18.03.2021, 22:38

Теги

Похожие вопросы