Я пытаюсь найти использование шаблона 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
{<-располагает с интервалами вокруг, важен}) в переменной.
Вот единственный вызов 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
ссылается, сделайте так внутренние двойные кавычки, как в примере выше.
Необходимо выполнить это со второй командой 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 <