Я хотел бы передать пару переменных оболочки в команду awk, которая затем использует регулярные выражения для сопоставления их в поле. Однако я хочу, чтобы содержимое переменных обрабатывалось как литералы в регулярном выражении. Все это делается для каждой строки входного файла.
Итак, это
123^A
будет найден в любом из этих
123^A|field2|field3
123^A~000^A|field2|field3
000^A~123^A|field2|field3
000^A~123^A~999^A|field2|field3
Но ни один из них
123^B|field2|field3
1234^A|field2|field3
123|field2|field3
123~000|field2|field3
Пример, который не работает:
read inputfile?'Enter the input file: '
read tackedonvalue?'Enter the value to tack onto each input value: '
read searchfile?'Enter the search file: '
read fieldnum?'Enter the field number to search: '
read delim?'Enter the field delimiter: '
while read -r SEARCHTERM
do awk -F"${delim}" -v a="(^|~)${SEARCHTERM}${tackedonvalue}(~|$)" -v COL="${fieldnum}" '$COL ~ /a/' ${searchfile} >> output_file.txt
done < ${inputfile}
- "123" будет строкой из переменной
$inputfile
из ввода
- «^ A» будет переменной
$tackedonvalue
из входных данных
Что делает этот пример неработающим, так это то, что переменная $tackedonvalue
часто содержит ^
символов, которые затем необходимо экранировать для регулярного выражения. (Экранировать их вручную во входных данных нельзя). В эту переменную также могут быть введены другие специальные символы, которые также необходимо экранировать, поэтому я не хочу искать / заменять каждый специальный символ для каждого случая.
Еще один пример, который я попробовал первым, но не смог приступить к работе (те же подсказки ввода и while read
, что и раньше):
awk -F"${delim}" -v a="${SEARCHTERM}" -v b="${tackedonvalue}" -v COL="$fieldnum" '$COL ~ ("(^|~)" a b "(~|$)")' ${searchfile} >> output_file.txt
Я думаю, что это не сработало из-за начального и конечного якорей, но я не мог понять, как их исправить, и поэтому пришлось использовать константу регулярного выражения (/ pattern / с косой чертой).
Если бы якоря могли быть исправлены для этого второго примера И содержимое переменной было бы обработано как литералы, то это был бы другой маршрут.
P.S. - Первый пост, дайте мне знать, что изменить / улучшить / предоставить.