sed не работает с переменной в скрипте bash; запрашивая файл. Простой пример - PullRequest
0 голосов
/ 10 ноября 2018

Если я объявляю переменную в скрипте bash, а затем пытаюсь работать с ней с помощью sed, я получаю ошибки. Я пробовал использовать двойные кавычки, обратные тики и избегать одинарных кавычек в моей переменной. Вот что я делаю по сути.

Вызов моего сценария с несколькими параметрами

./myScript.sh apples oranges ilike,apples,oranges,bananas

Моя цель - использовать sed для замены $ 3 "," на "", а затем использовать wc -w для подсчета количества слов в $ 3.

MyScript.sh

fruits="$3"
checkFruits= sed -i 's/,/ /g' <<< "$fruits"
echo $checkFruits

И результат после запуска скрипта в терминале:

ilike,apples,oranges,bananas
sed: no input files

P.s. После бесчисленных поисков в Google, чтения предложений и игры с моим кодом, я просто не могу заставить этот простой пример кода работать, и я не совсем уверен, почему. И я не могу попытаться реализовать wc -w, пока не перейду этот блок.

Ответы [ 4 ]

0 голосов
/ 10 ноября 2018

Вам вообще не нужно sed.

IFS=, read -a things <<< "$3"
echo "${#things[@]}"
0 голосов
/ 10 ноября 2018

Флаг -i для sed требует аргумент файла, без которого команда sed делает то, что вы ожидаете.

Однако я бы подумал об использовании tr вместо sed для этой простой замены:

fruits="$3"
checkFruits="$(tr , ' ' <<< $fruits)"
echo $checkFruits

Глядя на более широкую картинку, хотите ли вы посчитать строки, разделенные запятыми, или количество слов после замены запятых на пробелы? Например, хотите ли вы, чтобы строка "i like,apples,oranges,and bananas" возвращала счет 4 или 6? (Этот вопрос спорный, если вы на 100% уверены, что в ваших входных данных никогда не будет пробелов.)

Если 6, то другие ответы (включая мой) уже будут работать.

Однако, если вы хотите, чтобы ответ был 4, то вы можете сделать что-то еще, например:

fruits="$3"
checkFruits="$(tr , \\n <<< $fruits)"
itemCount="$(wc -l <<< $checkFruits)"

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

0 голосов
/ 10 ноября 2018

Вы можете сделать

fruits="$3"
checkFruits="${3//,/ }"
# or 
echo "${3//,/ }"
0 голосов
/ 10 ноября 2018

Опция -i предназначена для редактирования входного файла на месте, здесь он вам не нужен.

Чтобы назначить вывод команды переменной, используйте расширение команды, например var=$(command).

fruits="$3"
checkFruits=$(sed 's/,/ /g' <<< "$fruits")
echo $checkFruits
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...