Как сохранить подобранный шаблон в переменную с помощью 'sed' команду?

Я пытаюсь найти использование шаблона sed команда в file.txt между первым char1 и char2 и затем заменяют это строкой. как ниже с echo пример режима:

echo "This X is test Y. But X is not test Y." | sed 's/X[^Y]*Y/REPLACE/'

Также я должен сохранить подобранный шаблон (как is test {<-располагает с интервалами вокруг, важен}) в переменной.

5
задан 7 November 2014 в 12:11

2 ответа

Вот единственный вызов sed, который пишет пересмотренную строку в stdout, одновременно сохранив удаленный текст в переменной оболочки var:

$ var=$(echo "This X is test Y. But X is not test Y." | sed -nr 'h;s/[^X]*X([^Y]*)Y.*/\1/;p;x;s/X[^Y]*Y/REPLACE/;w /dev/stderr') 2>&1
This REPLACE. But X is not test Y.

Значение var :

$ echo "==$var=="
== is test ==

Объяснение:

  • h

    Эта команда копирует текущий шаблон в пространство хранения.

  • s/[^X]*X([^Y]*)Y.*/\1/;p

    Это удаляет все из пространства шаблона кроме текста между первым X и Y включая любые пробелы. Это затем печатается к stdout. Это - вывод, который получен оболочкой и присвоен var.

  • x

    Это копирует сдерживать пространство в пространство шаблона. Когда это сделано, пространство шаблона содержит копию исходной входной строки.

  • s/X[^Y]*Y/REPLACE/; w /dev/stderr

    Замена сделана, и результат записан в stderr.

  • 2>&1

    После того, как оболочка получила stdout в var, это дает оболочке команду копировать stderr (который имеет строку с ЗАМЕНОЙ) к stdout.

В стороне при обработке переменной var

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

9
ответ дан 23 November 2019 в 08:46

Необходимо выполнить это со второй командой sed:

var=$(echo "This X is test Y. But X is not test Y." | \
tee >(sed 's/X[^Y]*Y/REPLACE/' >/dev/stderr) | \
sed -r 's/[^X]*X([^Y]*)Y.*/\1/')

Exlanation:

  • Необходимо использовать tee разделять поток. То, что оба stdout и stderr содержите строку.
  • tee нуждается в файле как в аргументе. Мы даем tee канал, где sed слушает от и заменяет строку.
  • sed печатает строку к stderr: Вывод Вы видите в терминале.
  • Второе sed команда слушает на stdout и извлекает необходимую строку, которая теперь сохраняется в переменную $var (contect stdout).

Использование, что для проверки:

$ echo ">$var<"
> is test <
3
ответ дан 23 November 2019 в 08:46

Другие вопросы по тегам:

Похожие вопросы: