"^ Обратный слэш не последний символ в строке" в 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 нарушает мое решение?

Благодарю.

  • Извлечение информации о трассировке с помощью gawk
  • Найти Максимум всех столбцов на основе отдельного первого столбца
  • Исключение переменных gawk для команд оболочки
  • Как конвертировать awk one-liner в автономный скрипт?
  • как конкатенировать следующую строку, когда условие истинно awk
  • Использование awk для обработки файла сопоставления с динамическим числом столбцов
  • отобразить отсутствующий счетчик icmp_seq | команда ping
  • Как сохранить смешанные форматы перевода строки в gawk?
  • 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) – это просто число. Окончательная линия повторно собрана из двух других частей исходных данных.

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