#shell #parameters #redirect #quoting
#оболочка #параметры #перенаправление #цитирование
Вопрос:
Как мне изолировать текст в кавычках из файла в переменную оболочки?
Также: как мне игнорировать строки, начинающиеся с '#'
?
Допустим, у меня есть текстовый файл
8723 "полное имя" "дополнительные данные здесь" #5002 "другое имя" "бла-бла-бла" 7129 "single" blablabla 3910 noquote "bla bla bla"
и я хочу написать скрипт, который выполняет
#!/bin/sh
myscript <KEY> "<FULL NAME>" "<MORE DATA>"
для каждой строки в текстовом файле.
Если это упрощает задачу, вы можете предположить, что FULLNAME и MOREDATA в текстовом файле всегда заключены в кавычки, даже если они состоят из одного слова.
Я попробовал простой
#!/bin/sh
while read key name extra
do
echo "myscript $key "$name" -- "$extra""
#myscript $key "$name" "$extra"
done < list.txt
но это не группирует значение внутри кавычек в одной переменной оболочки.
Результат таков
myscript 8723 ""полный" -- "имя" "дополнительные данные здесь"" myscript #5002 ""другое" -- "имя" "бла-бла-бла"" myscript 7129 ""single"" - "blablabla" myscript 3910 "без кавычек" -- ""бла-бла-бла""
Вместо этого я хотел бы получить
myscript 8723 "полное имя" - "дополнительные данные здесь" myscript 7129 "single" - "blablabla" myscript 3910 "без кавычек" -- "бла-бла-бла"
Конечно, я могу добавить myscript
к каждой строке исходного текстового файла и превратить этот файл в скрипт или написать C
программу для этого…
Ответ №1:
#!/bin/sh
while read key name extra
do
eval myscript $key $name $extra
done <(grep -v "^#" list.txt)
Комментарии:
1. Это в основном то же самое, что и моя попытка: когда имя имеет встроенный пробел,
--
будет вставлено внутри имени, как в"full -- name"
. Спасибо
Ответ №2:
sed -e '/^[^#]/s/^/myscript /' list.txt
РЕДАКТИРОВАТЬ: Для его запуска:
sed -e '/^[^#]/s/^/myscript /' list.txt | bash
Комментарии:
1. Это выполняется не
myscript
так, как я хочу. Он добавляет текст в начало каждой строки (кроме строк, начинающихся с#
): Я хочу вызватьmyscript
с параметрами, поступающими из текстового файла.2. Это может быть немного короче:
$(sed -e '/^[^#]/s/^/myscript /' list.txt)
3. @jlliagre или еще короче: `sed -e’/^[^#]/s / ^ /myscript /’ list.txt `