Аргумент командной строки не работает для команды «grep» в Bash

#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 в качестве шаблона.