Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: bash - разбор строки с кавычками  (Прочитано 2136 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Malamut

  • Автор темы
  • Ubuntu Member
  • Администратор
  • Старожил
  • *
  • Сообщений: 3337
  • Я добрый, честно!
    • Просмотр профиля
    • Моя страница на Launchpad
bash - разбор строки с кавычками
« : 19 Ноября 2012, 19:06:17 »
Задача: нужно передать через опции ядра строку параметров вида

-f -u "tt t tt" -d TEST --data scard:scard -- 0.0.0.0

Т.е. хочется написать что-то типо  test="-f -u \"tt t tt\" -d TEST --data scard:scard -- 0.0.0.0" в grub (pxelinux, isolinux etc), а потом в bash-скрипте распарсить /proc/cmdline и выцепить значение test. Фактически нужно передать абсолютно произвольную строку.

Собственно, вопрос стоит в том, как из /proc/cmdline выцепить значение test, если само значение заключено в кавычки, содержит пробелы и экранированные кавычки.

пока не было ни кавычек, ни пробелов, всё решалось просто:

for opt in `cat /proc/cmdline`
do
        echo $i
done

Однако, понятное дело, с пробелами получим полную лажу, поскольку строка тупо разобьётся по ним, полностью игнорируя кавычки.

И ещё попутный вопрос: такая произвольная строка в опциях запуска ядра ничего случайно не поломает? :coolsmiley:
« Последнее редактирование: 19 Ноября 2012, 19:08:14 от Malamut »
"Носителем суверенитета и единственным источником власти в Российской Федерации является ее многонациональный народ" Конституция РФ

Оффлайн ArcFi

  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
Re: bash - разбор строки с кавычками
« Ответ #1 : 19 Ноября 2012, 19:12:53 »
$ echo -e 'ab\x22cd\x27ef'
ab"cd'ef

$ echo -e 'ab\x22cd\x27ef' | awk -F'\x22|\x27' '{print $2}'
cd
Поможет?

Оффлайн Malamut

  • Автор темы
  • Ubuntu Member
  • Администратор
  • Старожил
  • *
  • Сообщений: 3337
  • Я добрый, честно!
    • Просмотр профиля
    • Моя страница на Launchpad
Re: bash - разбор строки с кавычками
« Ответ #2 : 19 Ноября 2012, 19:21:07 »
В теории, как вариант. Хотя хотелось бы передавать всё же читаемую строку, чтобы можно было вручную редактировать без особенного бубна.

А какой командочкой заменить спецсимволы на их коды в строке?
"Носителем суверенитета и единственным источником власти в Российской Федерации является ее многонациональный народ" Конституция РФ

Оффлайн victor00000

  • Старожил
  • *
  • Сообщений: 15568
  • Глухонемой (Deaf)
    • Просмотр профиля
Re: bash - разбор строки с кавычками
« Ответ #3 : 19 Ноября 2012, 19:39:02 »
L~$ echo "ab\"cd'ef"
ab"cd'ef
Wars ~.o

Оффлайн ArcFi

  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
Re: bash - разбор строки с кавычками
« Ответ #4 : 19 Ноября 2012, 20:05:20 »
Malamut,
Код: (bash) [Выделить]
$ echo 'abc="123" test="-f -u \"tt t tt\" -d ... 0.0.0.0" def="456"' | grep -o 'test="[^"]*\\"[^"]*\\"[^"]*"'
test="-f -u \"tt t tt\" -d ... 0.0.0.0"
« Последнее редактирование: 19 Ноября 2012, 22:37:07 от arcfi »

Оффлайн Malamut

  • Автор темы
  • Ubuntu Member
  • Администратор
  • Старожил
  • *
  • Сообщений: 3337
  • Я добрый, честно!
    • Просмотр профиля
    • Моя страница на Launchpad
Re: bash - разбор строки с кавычками
« Ответ #5 : 19 Ноября 2012, 20:22:25 »
arcfi,
Не универсально( Достаточно добавить ещё кавычек - и всё к чертям летит. А смысл в том, чтобы не париться и тупо передавать опцией строку запуска проги. А она может иметь очень разный вид.
"Носителем суверенитета и единственным источником власти в Российской Федерации является ее многонациональный народ" Конституция РФ

Оффлайн victor00000

  • Старожил
  • *
  • Сообщений: 15568
  • Глухонемой (Deaf)
    • Просмотр профиля
Re: bash - разбор строки с кавычками
« Ответ #6 : 19 Ноября 2012, 20:33:02 »
for opt in `cat /proc/cmdline | sed 's/ /@/g'`
do
        echo $opt | sed 's/@/ /g'
done
Wars ~.o

Оффлайн Malamut

  • Автор темы
  • Ubuntu Member
  • Администратор
  • Старожил
  • *
  • Сообщений: 3337
  • Я добрый, честно!
    • Просмотр профиля
    • Моя страница на Launchpad
Re: bash - разбор строки с кавычками
« Ответ #7 : 19 Ноября 2012, 20:35:56 »
victor00000,
Идея интересная, хотя в предложенном варианте, конечно, работать не будет. ээх. опять регекспы на ровном месте использовать(
"Носителем суверенитета и единственным источником власти в Российской Федерации является ее многонациональный народ" Конституция РФ

Оффлайн ArcFi

  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
Re: bash - разбор строки с кавычками
« Ответ #8 : 19 Ноября 2012, 22:35:45 »
Malamut,
Код: (bash) [Выделить]
$ echo 'abc="123" test="-f -u \"tt t tt\" -d ... \"0.0.0.0\"" def="456"' | grep -Po 'test="(?:(\\"|[^"]))*"'
test="-f -u \"tt t tt\" -d ... \"0.0.0.0\""

Оффлайн Malamut

  • Автор темы
  • Ubuntu Member
  • Администратор
  • Старожил
  • *
  • Сообщений: 3337
  • Я добрый, честно!
    • Просмотр профиля
    • Моя страница на Launchpad
Re: bash - разбор строки с кавычками
« Ответ #9 : 19 Ноября 2012, 22:58:34 »
Yes! Вот и perl пошёл :coolsmiley:

arcfi,
Спасибо, идея ясна и уж как-нибудь я её реализую. Меня собственно интересовали встроенные способы работы со строками в баше. Краткий гуглёж показал, что их нет.
"Носителем суверенитета и единственным источником власти в Российской Федерации является ее многонациональный народ" Конституция РФ

Оффлайн ArcFi

  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
Re: bash - разбор строки с кавычками
« Ответ #10 : 20 Ноября 2012, 00:39:16 »
Чисто из интереса, тему sed'а можно чуток развить:
Код: (bash) [Выделить]
echo 'abc="123" test="-f -u \"tt t tt\" -d ... \"0.0.0.0\"" def="456"' | sed 's/\\"/\x01/g' | grep -o 'test="[^"]*"' | sed 's/\x01/\\"/g'
test="-f -u \"tt t tt\" -d ... \"0.0.0.0\""

Yes! Вот и perl пошёл :coolsmiley:
Пришлось недавно XML распарсить, а под рукой ничего более подходящего не оказалось. %)
« Последнее редактирование: 20 Ноября 2012, 00:52:07 от arcfi »

 

Страница сгенерирована за 0.031 секунд. Запросов: 25.