Как мне изолировать текст в кавычках из файла в переменную оболочки?

#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 `