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

Благодарю.

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) – это просто число. Окончательная линия повторно собрана из двух других частей исходных данных.

  • awk для разделения входного файла на 2 файла (один для дублированных значений и один для уникальных значений)
  • Исключение переменных gawk для команд оболочки
  • awk - изменить значение
  • Почему этот gawk coprocess висит?
  • Другой вопрос awk (ward) - подстановка подстроки с несколькими ключами
  • Почему более новые версии awk печатают большие целые числа вместо десятичных знаков?
  • Извлечение данных с помощью awk, когда некоторые строки имеют пустые / отсутствующие значения
  • Пропустить первые 6 строк / строк в текстовом файле с помощью awk
  • Замените данные в столбце в файле данными в строке из другого файла
  • Регулярное выражение ERE для разделения () между разделителем и конечным словом
  • Добавление содержимого нескольких файлов с помощью awk
  • Interesting Posts
    Linux и Unix - лучшая ОС в мире.