Если у меня есть текстовая строка вроде:

Here is a replace_script_start.scriptinjection1.python.replace_script_end string and here is replace_script_start.scriptinjection2.groovy.replace_script_end another string

Я хотел бы извлечь содержимое между replace_script_start и replace_script_end с помощью sed. Я пробовал много шаблонов, но безуспешно, ближе всего к тому, что я получил, использовал это:

echo 'Here is a replace_script_start.scriptinjection1.python.replace_script_end string and here is replace_script_start.scriptinjection2.groovy.replace_script_end another string' | sed 's/[^<]*replace_script_start.\([^<]*\).replace_script_end[^<]*/\1\\n/gp'

Я хотел бы, чтобы sed вывести:

scriptinjection1.python

scriptinjection2.groovy

Любая помощь будет оценена. Примечание. Также изучил grep и awk (которые сработали для меня), но предпочел бы, чтобы это происходило с помощью sed , если это возможно.

1
hjuk12 7 Фев 2021 в 08:59

3 ответа

Лучший ответ

Вы можете попробовать gnu grep:

grep -oP '(?<=replace_script_start\.).+?(?=\.replace_script_end)' file

scriptinjection1.python
scriptinjection2.groovy

sed не является идеальным решением, но, поскольку он был задан здесь, это gnu sed в два этапа:

sed -E 's/replace_script_start\.|\.replace_script_end/\n&\n/g' file |
sed -En '/^replace_script_start\./,/^\.replace_script_end/{//!p;}

scriptinjection1.python
scriptinjection2.groovy
1
anubhava 7 Фев 2021 в 06:46

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

sed -n '/replace_script_start\./{s//\n/;s/.*\n//;s/\.replace_script_end/\n/;P;D}' file

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

N.B. Решение совпадает по replace_script_start. и .replace_script_end, то есть оно также соответствует периоду префикса / суффикса.

0
potong 7 Фев 2021 в 11:38

Сначала используйте начальный тег, чтобы разместить все части на разных строках.
Затем удалите конечный тег и все, что за ним.

echo "your_line" | sed 's/replace_script_start/\n/g'| sed -n 's/replace_script_end.*//p'
0
Walter A 8 Фев 2021 в 22:52
66084998