"^ Обратный слэш не последний символ в строке" в gawk

Я хотел бы совместить число между / и , в каждой строке, и увеличить его на 3. Например

Вездесущий обратный скепс / 49, черный

становится

Вездесущий обратный слэш / 52, черный

Моя команда gawk:

 $ gawk '{b=gensub(/\/([0-9]+),/, "/" (\\1+3) ",") ; print b}' add.jpdf gawk: cmd. line:1: ^ backslash not last character on line 

Мне было интересно, что означает «обратная косая черта не последний символ на линии»? Какое правило синтаксиса gawk нарушает мое решение?

Благодарю.

  • текстовая обработка (чтение и вычисление из двух файлов)
  • Найдите не точное соответствие и возвращаемый столбец 1 этого файла
  • awk условие true и false
  • Добавление содержимого нескольких файлов с помощью awk
  • Использование awk для обработки файла сопоставления с динамическим числом столбцов
  • awk найти строки с двумя совпадениями
  • элементы доступа в строчном массиве - символ рассеяния @
  • Условное предложение if в awk
  • One Solution collect form web for “"^ Обратный слэш не последний символ в строке" в gawk”

    gensub() ожидает строку как второй аргумент. Вы пытаетесь объединить / и вокруг выражения (\\1+3) которое, по вашему мнению, будет оцениваться функцией. Я не буду. Он вычисляется перед вызовом функции. Вы используете \1 для ссылки на соответствующую группу захвата () в regexp, но вы можете использовать ее только в строке, а не в выражении.

    Поэтому в лучшем случае вы можете использовать в качестве второго аргумента "/\\1+3," , но затем получите результат ...Backslash/49+3,Black . Таким образом, вы не можете оценить часть 49 + 3.

    Если вы хотите сделать арифметику в матче, вы должны сначала извлечь строку, выполнить арифметику, а затем поместить ее обратно в строку. Например,

     awk '{ n = split($0, d, /\/([0-9]+),/, s) print d[1] "/"(substr(s[1],2)+3)"," d[2] }' 

    Это использует функцию split() gnu awk с regexp, чтобы разделить строку на 3 части: часть перед совпадением в d[1] , часть после совпадения в d[2] и совпадающая строка "/49," в s [1]. Вы действительно должны проверить, что n равно 2, чтобы вы получили ровно одно совпадение.

    Затем вы можете извлечь номер из согласованной строки, просто пропустив начальную "/" , выполните арифметику и соедините все части вместе снова.


    Если шаблон может появляться несколько раз в одной строке ваших данных, лучшим решением является использование match() чтобы найти только последнее вхождение и вырезать строку, используя substr() :

     awk '{ match($0, /.*\/([0-9]+),/, m) a = m[1,"start"] b = m[1,"length"] if(a)print substr($0,1,a-1) substr($0,a,b)+3 substr($0,a+b) else print }' 

    Здесь шаблон имеет .* Добавлен спереди, чтобы соответствовать только последнему вступлению. a задается позиция символа начала группы захвата () в регулярном выражении, а b – ее длина, поэтому substr($0,a,b) – это просто число. Окончательная линия повторно собрана из двух других частей исходных данных.

    Interesting Posts
    Linux и Unix - лучшая ОС в мире.