LINUX.ORG.RU
решено ФорумAdmin

Как со строки считать слова в ковычках? bash

 , , , ,


0

2

Считывание слов со строки, которые разделены пробелом(ами)/эндлайном/табулятором это легко.
А как при этом считывать отдельно еще и «слова», которые могут содержать пробелы, и которые определены кавычками? Обычные ковычки. Просто если в скрипте именно так и считывать, то оно игнорирует и ковычки и escape-символ \ и т.д., и в результате если видит хотябы один пробел или эндлайн, то воспринимает как отдельное слово.
Т.е. нужно чтобы считывало как bash считывает аргументы функций.

При этом в скрипте через функцию почему-то не получается:

keywords_test="allsecurityinfo                     \"/media/kukubuntu/Data/AAA_Work/Programing/WEB/allsecurity.info\"
ubuntu_program_files                \"/media/kukubuntu/Data/Program Files/AAA_Ubuntu\""

function readkeywords() {
    echo "\$1 = $1"
    echo "\$2 = $2"
    echo "\$3 = $3"
    echo "\$4 = $4"
    echo "\$5 = $5"
    echo "\$6 = $6"
}

readkeywords $keywords_test
exit 0

выдаёт:

$1 = allsecurityinfo
$2 = "/media/kukubuntu/Data/AAA_Work/Programing/WEB/allsecurity.info"
$3 = ubuntu_program_files
$4 = "/media/kukubuntu/Data/Program
$5 = Files/AAA_Ubuntu"
$6 = 

В принципе можно написать програмку всякими этими рэгэкспами, но может быть можно реализовать как-нибудь по-простому?

$ cat /tmp/228.sh 
#! /bin/sh
keywords_test="allsecurityinfo                     \"/media/kukubuntu/Data/AAA_Work/Programing/WEB/allsecurity.info\" ubuntu_program_files                \"/media/kukubuntu/Data/Program Files/AAA_Ubuntu\""
eval "array=($keywords_test)"
for token in "${array[@]}"; do
    echo "$token"
done

$ /tmp/228.sh 
allsecurityinfo
/media/kukubuntu/Data/AAA_Work/Programing/WEB/allsecurity.info
ubuntu_program_files
/media/kukubuntu/Data/Program Files/AAA_Ubuntu

надеюсь, у тебя нет примеров вида "\$(rm -rf ~)", а то будет больно

f1u77y ★★★ ()
Последнее исправление: f1u77y (всего исправлений: 1)

Не знаю, правильно ли я понял твою задачу, но может поможет.

#!/bin/bash

KEYWORDS='a "b c"
b "c d"'

IFS='"'

for STRING in $KEYWORDS
do
        echo $STRING
done
shell-script ★★★★★ ()
Ответ на: комментарий от f1u77y

eval для разбора переменных? Да вы, батенька, знаете толк в извращенияхбезопасности.

shell-script ★★★★★ ()

Америка, не валяй дурака, бери перл.

echo -n "hello world 'and other things' 123" | perl -ne 'use Text::ParseWords; @words = parse_line("\\s+", 0, $_); print "$_\n" for @words;'
hello
world
and other things
123
anonymous ()
Ответ на: комментарий от anonymous

выглядит вроде понятно, не то что эти sedы
ну по сути, f1u77y реализовал использование парсера баша для этого - как раз то что надо, и ничего лишнего.

Kukuster ()
Ответ на: комментарий от shell-script

Я немного не то имел введу
тут через line оно считывает построчно, и просто убирает ковычки
мне просто надо было, чтобы данные текста считывались как парсером баша для аргументов функций, ну + чтобы при этом эндлайн тоже воспринимался как разделитель
А за IFS спасибо, прикольная фигнюшка

Kukuster ()
Ответ на: комментарий от anonymous

Переносы строк внутри аргументов нужно доработать напильником. Но ты уверен, что это тебе надо? Ты, случаем, не csv там изобретаешь?

echo -ne "hello  world 'and oth\ner things' \t 123" | perl -e 'use Text::ParseWords; $_=join("", <STDIN>); @words = parse_line("\\s+", 0, $_); print "|$_|\n" for @words;'
|hello|
|world|
|and oth
er things|
|123|
anonymous ()
% print -rl -- ${(Q)${(z)keywords_test}}

// мимокрокодил

salsa ()
#!/bin/bash

keywords_test=(
  allsecurityinfo                       "/media/kukubuntu/Data/AAA_Work/Programing/WEB/allsecurity.info"
  ubuntu_program_files                  "/media/kukubuntu/Data/Program Files/AAA_Ubuntu"
)

function readkeywords() {
    echo "\$1 = $1"
    echo "\$2 = $2"
    echo "\$3 = $3"
    echo "\$4 = $4"
    echo "\$5 = $5"
    echo "\$6 = $6"
}

readkeywords "${keywords_test[@]}"
exit 0
anonymous ()

Ковычки
Ковычки
Ковычки

Убивать!
Убивать!
Убивать!

ashot ★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.