#bash #shell #scripting
Вопрос:
#! /bin/bash
grep -oh w*ings "${1}"
в то время как приведенная выше команда работает в терминале, я не могу понять проблему в сценарии
Я пытаюсь найти все слова в файле, которые заканчиваются на «ing»
Комментарии:
1. Что ты пытаешься сделать? Вы хотите, чтобы он был расширен?
*
Содержит ли текущий рабочий каталог скрипта файлы, соответствующие этому глобусу? Ты пробовалgrep -oh 'w*ings' "${1}"
?2. я пытаюсь найти слова, которые заканчиваются на ing в данном файле. Я попробовал grep-oh ‘w*ings’ «${1}», и это не сработало
3.
w*ings
соответствует строкам (в вашем случае из-за-w´, full words) which contain zero or more occurances of the letter
w, followed by
ings. It would match
ings` илиwwwwwingx
, но неxwings
.4. Пожалуйста, проясните вашу конкретную проблему или предоставьте дополнительные сведения, чтобы точно указать, что вам нужно. Поскольку это написано в настоящее время, трудно точно сказать, о чем вы просите.
Ответ №1:
Для grep
того , чтобы строка w*ings
была регулярным выражением. Для оболочки строка w*ings
-это шарик. Строка w*ings
представляет собой шарик с экранированным w
. Оболочка возьмет строку w*ings
и преобразует ее в w*ings
, а затем (я на самом деле не уверен в порядке здесь; мы можем проверить документацию, но это не важно) она будет искать в текущем каталоге, чтобы увидеть, соответствует ли этот глобус каким-либо файлам. Если в каталоге несколько файлов, он расширится до них. например, если у вас есть файлы waings
и wbings
, то оболочка передаст оба в качестве аргументов в grep. Предполагая $1
, что расширяется до foo
, grep
получим аргументы: -oh
, waings
, wbings
, и foo
точно так же, как если бы вы призвали grep -oh waings wbings foo
. Это почти наверняка не то, чего вы хотите. Вероятно , вы намеревались передать литеральную строку w*ings
grep
, поэтому вам следовало это сделать:
grep -oh 'w*ings' "${1}"
Но из вашего комментария следует, что вы действительно хотите сделать что-то вроде:
grep -o '[[:<:]][_[:alnum:]]*ing[[:>:]]' "${1}"
или
grep -ow '[_[:alnum:]]*ing' "${1}"
( -w
эквивалентно обертыванию шаблона в [[:<:]]
и [[:>:]]
)
Комментарии:
1. Я попробовал этот grep-oh ‘w*ings’ «${1}», и он не работает. Я хочу найти все слова в файле, который заканчивается на «ing»
2. @RaviTejaReddy Это работает, просто он делает не то, что вы хотите. Вам нужно описать (в вопросе, а не в комментариях) поведение, которого вы ожидаете.
Ответ №2:
Это было бы
grep -oh '.*wings' "$1"
Комментарии:
1. На самом деле я пытаюсь найти все слова, которые заканчиваются на » ing » в файле
2. Тогда просто адаптируйте мое решение к этому: используйте
.*ing
в качестве шаблона.