2

Я пытаюсь получить количество вхождений в сценарии, и при запуске команды в командной строке она работает нормально, но не в сценарии. Обе переменные инициализируются. FILE_PATH - это абсолютный путь к файлу, а VARIABLE_NAME - что-то вроде firstName или lastName.

VARIABLE_NAME="_firstName"    
grep -cP "\(this\.|\s\){1}$VARIABLE_NAME" $FILE_PATH

Когда я беру $ VARIABLE_NAME из сценария и заменяю его непосредственно на то, что я ищу, он работает как положено, поэтому что-то с заменой.

Есть идеи, что я могу попробовать?

4 ответа4

2

Проблема, кажется, находится в вашем регулярном выражении. Можете ли вы показать нам, что вы пытаетесь соответствовать?

если вы пытаетесь сопоставить конструкции как это:

this.contentOfVar
  contentOfVar

попробуйте это со следующим:

grep -cP "(this\.|\s)$VARIABLE_NAME" $FILE_PATH

Это работает в GNU grep. Вам не нужно указывать {1} , так как по умолчанию будет 1. Если флаг -P , \( и \) будут совпадать с литеральными скобками в строке, так как это поведение perl.

0

Похоже, что проблема в том, чтобы вырваться из регулярных выражений. Вот полный рабочий пример того, как я мог бы сделать что-то подобное.

#!/bin/bash

VARIABLE_NAMES=(testOne testTwo)
RE="(this\.|\s){1}"

cat > ./testfile.txt <<EOF
this.testOne
this.testTwo
this.testTwo
this.testOne
this.testTwo
EOF

for VARIABLE_NAME in ${VARIABLE_NAMES[@]}; do
    grep -cP "${RE}${VARIABLE_NAME}" testfile.txt
done

exit 0
0

Это связано с выходом из кавычек и слешей:

VARIABLE_NAME="_firstName"
FILE_PATH="/tmp/*"
echo grep -cP \"\\\(this\\\.\|\\\s\\\)${VARIABLE_NAME}\" $FILE_PATH
grep -cP \"\\\(this\\\.\|\\\s\\\)${VARIABLE_NAME}\" $FILE_PATH

Я добавил эхо в качестве примера, чтобы показать, как оно на самом деле интерпретируется.

0

Чтобы добавить к ответам других, я бы предложил использовать одинарные кавычки, кроме случаев, когда вам явно нужно что-то из переменной. Например:

#!/usr/bin/env bash

dosomething | grep -cP 'some stuff'${SOMEVARIABLE}'more stuff';

Если вам нужно использовать одинарные кавычки в регулярном выражении, это выглядит немного страшнее:

# ...
dosomething | grep -cP 'some stuff'"'"'this part has a single-quote around it'"'"${SOMEVARIABLE}'more stuff';

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

-Брайан

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .