2015-02-12 3 views
0

Я пытаюсь найти точную строку, расположенную в символах номер 4-7. Когда я запускаю команду cut на терминале, она работает, , однако в скрипте она терпит неудачу, поскольку я считаю, что оператор if предоставляет мне «0». Это то, что я сделал:Поиск точной строки

for NAME in `cat LISTS_NAME`; do 
if [[ John == cut -c 4-7 "${NAME}" ]]; then 
    Do Something ... 
fi 
if [[ Dana == cut -c 4-7 "${NAME}" ]]; then 
    Do Something... 
fi 

Можете ли вы посоветовать мне, как управлять этим с помощью cut или любой другой REG-ех?

+1

Уф, уф, много вещей, чтобы быть улучшены здесь. Вероятно, лучше сказать 'while IFS = читать символы; do ... done <<(cut -c4-7 file) ' – fedorqui

ответ

1

У вашего сценария много проблем, и вам не нужно cut. Используйте его таким образом:

while read -r line; do 
    if [[ "${line:3:4}" == "John" ]]; then 
     Do Something ... 
    elif [[ "${line:3:4}" == "Dana" ]]; then 
    Do Something... 
    fi 
done < LISTS_NAME 

В BASH "${line:3:3}" такое же, как cut -c 4-7


EDIT: Если вы не хотите точного соответствия строки, то вы можете использовать:

while read -r line; do 
    if [[ "${line:3}" == "John"* ]]; then 
     Do Something ... 
    elif [[ "${line:3}" == "Dana"* ]]; then 
    Do Something... 
    fi 
done < LISTS_NAME 
+1

Вероятно, должно быть' $ {line: 3: 4} '... В конце концов,« Джон »содержит 4 символа, а' cut -c 4- 7' возвращает 4 символа ... – twalberg

+0

Да, это так. Спасибо @twalberg – anubhava

+1

Как насчет '[[$ {line: 3} == John *]]'? это было бы проще обобщить на более длинные имена, не считая символов ': D'. –

1

Вы не используете команду cut. Вы сравниваете John и Dana с Литеральная строкаcut -c 4-7 <value-of-$NAME>.

Вы должны использовать:

if [[ John == $(cut -c 4-7 "${NAME}") ]]; then 

и т.д.

Это, как говорится, вы должны делать только обрезанный вызова один раз и хранить, что в переменной. И для точного соответствия вам нужно процитировать правую сторону ==, чтобы избежать globbing. Так

substr=$(cut -c 4-7 "${NAME}") 
if [[ John == "$substr" ]]; then 

И затем, чтобы избежать необходимости дублирующей if ...; then линии, которые вы могли бы сделать лучше с case заявления:

substr=$(cut -c 4-7 "${NAME}") 
case $substr in 
    John) 
     Do something 
    ;; 
    Dana) 
     Do something else 
    ;; 
esac 
Смежные вопросы