sed заменяет символ только между двумя известными строками - PullRequest
4 голосов
/ 09 февраля 2012

Можно ли заменить символ только между двумя известными строками?У меня есть несколько файлов в формате

title.header.index.subtitle.goes.here.footer

. Я могу выбрать «subtitle.goes.here» с сопоставлением с образцом между индексом (который мне нужен для обратной ссылки) инижний колонтитул (который является постоянным), но затем я хочу заменить символ точки / точки подчеркиванием, чтобы дать мне

title.header.index.subtitle_goes_here.footer

Таким образом, из ввода, такого как

title.header.01.the.first.subtitle.is.here.footer

Я хочу закончить с

title.header.01.the_first_subtitle_is_here.footer

То, что у меня до сих пор бесполезно, но начало: sed -r 's/([0-9][0-9]\.)([a-z]*\.*)*footer/\1footer/g'

Но это удаление целых субтитров и нижнего колонтитула перед тем, как вручную добавлять их обратно, и у меня есть много других недостатков, я уверен.Любая помощь будет высоко ценится.

Ответы [ 2 ]

4 голосов
/ 09 февраля 2012

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

echo "title.header.01.the.first.subtitle.is.here.footer" |
sed 's/\./_/4g;s/.\(footer\)/.\1/'
title.header.01.the_first_subtitle_is_here.footer

Уродливая альтернатива:

sed 'h;s/\([0-9][0-9]\.\).*\(\.footer\)/\1\n\2/;x;s/.*[0-9][0-9]\.\(.*\).footer/\1/;s/\./_/g;x;G;s/\(\n\)\(.*\)\1\(.*\)/\3\2/' file
1 голос
/ 09 февраля 2012

Если вы открыты для решения awk, это может помочь -

awk '
{for (i=1;i<=NF;i++) if (i!=NF) {printf (3<i && i<(NF-1))?$i"_":$i"."} print $NF}
' FS='.' OFS='.' file 

Входной файл:

[jaypal:~/Temp] cat file
title.header.index.subtitle.goes.here.footer
title.header.01.the.first.subtitle.is.here.footer

Тест:

[jaypal:~/Temp] awk '
{for (i=1;i<=NF;i++) if (i!=NF) {printf (3<i && i<(NF-1))?$i"_":$i"."} print $NF}
' FS='.' OFS='.' file 
title.header.index.subtitle_goes_here.footer
title.header.01.the_first_subtitle_is_here.footer
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...