Как использовать sed в той же строке за выражением соответствия - PullRequest
2 голосов
/ 24 марта 2020

Я получил текст :

cat README.md | grep "####.*"                                    
#### Creating a helm chart with 2 child helm chart helm v3
#### Check you helmchart repositories
#### List content of your main-helmchart
#### Helm v3 dependency update
#### Check the content of charts/ folder in main-helmchart/
#### Check what is going to be installed

и я пытаюсь сделать так, чтобы :

  - [Creating a helm chart with 2 child helm chart helm v3](#creating-a-helm-chart-with-2-child-helm-chart-helm-v3)
  - [Check you helmchart repositories](#check-you-helmchart-repositories)
  - [List content of your main-helmchart](#list-content-of-your-main-helmchart)
  - [Helm v3 dependency update](#helm-v3-dependency-update)
  - [Check the content of charts/ folder in main-helmchart/](#check-the-content-of-charts/-folder-in-main-helmchart/)
  - [Check what is going to be installed](#check-what-is-going-to-be-installed)

было есть ли способ использовать sed для этого?

Я пытаюсь сопоставить все, что стоит за "#" , подписать и заменить пробелы для да sh "-"

cat README.md | sed -E -n  's/^([#]{4}\s)(.*)$/- [\2](#\L\2)/p'  | sed -E  '/#.*/ s/ /-/g'  
--[Creating-a-helm-chart-with-2-child-helm-chart-helm-v3](#creating-a-helm-chart-with-2-child-helm-chart-helm-v3)
--[Check-you-helmchart-repositories](#check-you-helmchart-repositories)
--[List-content-of-your-main-helmchart](#list-content-of-your-main-helmchart)
--[Helm-v3-dependency-update](#helm-v3-dependency-update)
--[Check-the-content-of-charts/-folder-in-main-helmchart/](#check-the-content-of-charts/-folder-in-main-helmchart/)
--[Check-what-is-going-to-be-installed](#check-what-is-going-to-be-installed)

любой совет?

Thx

Ответы [ 2 ]

2 голосов
/ 24 марта 2020

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

sed -E '/^#### /{s///;h;y/ /-/;H;g;s/(.*)\n(.*)/   - [\1](#\2)/}' file

Для строк, которые начинаются ####, удалите хэши.

Скопируйте остаток в область удержания (HS) .

Заменить все пробелы на -.

Добавить исправленную строку к HS.

Заменить текущую строку на HS.

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

2 голосов
/ 24 марта 2020

С GNU sed

$ sed -E 's/^#+ (.*)/- [\1](#\L\1)/; :a s/(\(#[^ ]+) /\1-/g; ta' ip.txt
- [Creating a helm chart with 2 child helm chart helm v3](#creating-a-helm-chart-with-2-child-helm-chart-helm-v3)
- [Check you helmchart repositories](#check-you-helmchart-repositories)
- [List content of your main-helmchart](#list-content-of-your-main-helmchart)
- [Helm v3 dependency update](#helm-v3-dependency-update)
- [Check the content of charts/ folder in main-helmchart/](#check-the-content-of-charts/-folder-in-main-helmchart/)
- [Check what is going to be installed](#check-what-is-going-to-be-installed)
  • s/^#+ (.*)/- [\1](#\L\1)/ это соответствует #### Heading и конвертируется в - [Heading](#heading) формат
  • :a s/(\(#[^ ]+) /\1-/g; ta это все oop для замены всех пробелов, найденных после (#

Обратите внимание, что вы можете заменить cat+grep+sed+etc на одну команду с sed -nE '/^#### /{s/^#+ (.*)/- [\1](#\L\1)/; :a s/(\(#[^ ]+) /\1-/g; ta; p}' ip.txt


на perl

$ perl -pe 's/#+ (.+)/"- [$1](#" . lc($1) =~ tr| |-|r. ")"/e' ip.txt 
- [Creating a helm chart with 2 child helm chart helm v3](#creating-a-helm-chart-with-2-child-helm-chart-helm-v3)
- [Check you helmchart repositories](#check-you-helmchart-repositories)
- [List content of your main-helmchart](#list-content-of-your-main-helmchart)
- [Helm v3 dependency update](#helm-v3-dependency-update)
- [Check the content of charts/ folder in main-helmchart/](#check-the-content-of-charts/-folder-in-main-helmchart/)
- [Check what is going to be installed](#check-what-is-going-to-be-installed)

Perl разрешает perl код в секции замены с флагом e. Таким образом, вы можете сделать все это в одной замене. lc - для преобразования в нижний регистр, tr - для замены пробела на - и т. Д.

Для фильтра + подстановки используйте perl -ne 'print s/#+ (.+)/"- [$1](#" . lc($1) =~ tr| |-|r. ")"/re if /^#### /' ip.txt

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...