Linux sed - нужна помощь, чтобы выяснить, почему не работает сопоставление с образцом - PullRequest
0 голосов
/ 29 января 2012

Следующие строки sed работают со следующей строкой. Моя цель - передать данные, хранящиеся внутри значения, в переменную.

<input type="hidden" name="form_token" id="edit-system-site-maintenance-settings-form-token" value="0f5ae5a6e8bb84d3e18b30b7ff2a46b2" />

| sed 's/^.* value="//' \
| sed 's/ \/>//' \
| sed 's/"//'

Но я действительно думаю, что последняя строка - пустая трата времени. Я не понимаю, почему, когда я пытаюсь сделать это в одной строке, как показано ниже, это не соответствует должным образом.

| sed 's/" \/>//'

Просто к вашему сведению после того, как первая строка строки sed находится в следующем состоянии

483deac360aa1d0ea89cedbdcc4d051e" />

Ответы [ 3 ]

2 голосов
/ 29 января 2012

Некоторая педантичная нота. Нет необходимости в тройной sed мощности, вы можете получить то, что вы хотите, с помощью grep, а также регулярных выражений lookahead и lookbehind.

$> cat ./text 
<input type="hidden" name="form_token" id="edit-system-site-maintenance-settings-form-token" value="0f5ae5a6e8bb84d3e18b30b7ff2a46b2" />

$> grep -P -o "(?<=value=\")([a-f0-9]*)(?=\")" ./text 
0f5ae5a6e8bb84d3e18b30b7ff2a46b2
0 голосов
/ 29 января 2012

Это может работать для вас:

a='<input type="hidden" name="form_token" id="edit-system-site-maintenance-settings-form-token" value="0f5ae5a6e8bb84d3e18b30b7ff2a46b2" />'
b=$(sed 's/.*value="\("[^"]*\).*/\1/' <<<$a)
echo $b
0f5ae5a6e8bb84d3e18b30b7ff2a46b2

Пояснение:

  • Сохранить входную строку в переменную a
  • Назначить результат подстановки команды переменной b
    • Используйте строку here для доставки входной строки в sed <<<$a
    • Заменить всю входную строку обратной ссылкой \1, которая содержит все между двойными кавычками значения value
0 голосов
/ 29 января 2012

Он отлично работает в моей системе, но вы, вероятно, можете обойтись без:

sed -e 's?^.* value="??' -e 's?".*$??'

, как показано в этом транскрипте:

pax> echo '<input type="hidden" name="form_token" id="edit-system-site-maintenance-settings-form-token" value="0f5ae5a6e8bb84d3e18b30b7ff2a46b2" />' | sed -e 's?^.* value="??' -e 's?".*$??'
0f5ae5a6e8bb84d3e18b30b7ff2a46b2

GNU sed может использовать другие символы-разделителии это может свести к минимуму зигзаги, которые вы часто найдете в командах sed, например \/\/\/\/\/.

Кроме того, вам нужно всего лишь вызвать одну копию sed и дать ей несколькоКоманды для запуска в каждой строке.

Второй команды должно быть достаточно, чтобы убрать все после значения, особенно в более сложных, таких как:

<input type="hidden" name="xyzzy" value="plugh" something="else" />

Это, если вы хотите для использования инструментов обработки текста, таких как sed, для обработки XML.Есть более «надежные» способы сделать это с помощью подходящих инструментов, но я предполагаю, что вы можете держать свой XML-формат под контролем до такой степени, что sed сможет его обработать.

...