2015-10-01 3 views
2

Я использую некоторые функции sub(), gsub() для замены содержимого, хранящегося в переменной.Использование переменной в регулярном выражении

Скажем, например:

$ awk 'BEGIN {str="hello bee"; patt="llo"; gsub(patt,"XX",str); print str}' 
heXX bee 

Это заменяет в строке, содержащейся в str все вхождения llo с XX. Ницца.

Теперь скажите, что я хочу использовать более сложное регулярное выражение, которое использует как переменную, так и шаблон. Например, "he" + переменная patt. Как мне это сделать?

Если я пытаюсь с gsub(/he/patt, ...) он не работает:

awk 'BEGIN {str="hello bee"; patt="llo"; gsub(/he/patt,"XX",str); print str}' 

Возвращает

hello bee 

Вместо

XX bee 
+0

Добавлен тег [gawk], так как это тот, который я использую. Любое решение с использованием другого дистрибутива также приветствуется:) – fedorqui

ответ

3

Вот когда вам нужна конкатенация и поэтому должны использовать разделители строк вместо регулярных выражений разделителей для регулярного выражения:

$ awk 'BEGIN {str="hello bee"; patt="llo"; gsub("he"patt,"XX",str); print str}' 
XX bee 

Просто быть в курсе, что вы тогда должны удвоить любые управляющие символы, так как AWK имеет сначала преобразовать строку в регулярное выражение, чтобы использовать один из символов эвакуации.

+0

Ницца! Так, например, мне нужно сказать 'gsub (" he "patt" \\ s "," XX ", str)', то есть использовать '\\ s' вместо' \ s' для соответствия пробелу. – fedorqui

+2

Исправить. Если вы используете единственный escape, '\ s', тогда gawk даст вам предупреждение о' \ s', который рассматривается как литерал '' ', а затем сделайте это, но некоторые другие awks не будут вас предупреждать, а IIRC интерпретируйте его так, как если бы вы написали '\\ s', в то время как другие будут рассматривать его как' s'. –

0

это будет работать

awk 'BEGIN {str="hello bee"; patt="llo"; gsub(patt,"XX",str); print str}' 
heXX bee 

По существу вам необходимо определить полный шаблон как переменную, а не ее часть.

+1

Да! Это способ, и спасибо за это. Заметьте, однако, что мне интересно, есть ли способ сделать такую ​​конкатенацию. – fedorqui

2

Вы можете сделать:

awk 'BEGIN {str="hello bee"; patt="llo"; gsub("he" patt,"XX",str); print str}' 
XX bee 

/he/patt не Concat строку вместе, но "he" patt делает.

+0

О, хорошо! Таким образом, нет возможности конкатрировать строку с помощью '/ he /'? – fedorqui

+3

@fedorui '/ he /' не является строкой, ее регулярным выражением. Не существует такого понятия, как конъюнкция regexp, только конкатенация строк и преобразование строк в регулярные выражения, когда строки используются в контексте regexp. –

Смежные вопросы