Используйте Sed для замены строки другой строкой, полученной из регулярного выражения - PullRequest
1 голос
/ 03 апреля 2012

Я хочу заменить строку (в примере слово Linux) на то, что находится между # в первой строке.

Итак, я хочу включить:

#Windows#
1. Linux Sysadmin, Linux Scripting etc.
2. Databases - Oracle, mySQL etc.
3. Security (Firewall, Network, Online Security etc)
4. Storage in Linux
5. Productivity (Too many technologies to explore, not much time available)

в

1. Windows Sysadmin, Windows Scripting etc.
2. Databases - Oracle, mySQL etc.
3. Security (Firewall, Network, Online Security etc)
4. Storage in Windows
5. Productivity (Too many technologies to explore, not much time available)

или

#Solaris#
1. Linux Sysadmin, Linux Scripting etc.
2. Databases - Oracle, mySQL etc.
3. Security (Firewall, Network, Online Security etc)
4. Storage in Linux
5. Productivity (Too many technologies to explore, not much time available)

в:

1. Solaris Sysadmin, Solaris Scripting etc.
2. Databases - Oracle, mySQL etc.
3. Security (Firewall, Network, Online Security etc)
4. Storage in Solaris
5. Productivity (Too many technologies to explore, not much time available)

Просто использую sed. Я дошел до: седь / ^ # [a-zA-Z] * / { час d } / Linux / G '

Я думаю, что мне нужно сделать, это запустить регулярное выражение, используя буфер удержания в качестве шаблона замены, который, я думаю, будет выглядеть как s/Linux/g, но я не могу найти способ сделать это. У кого-нибудь есть идеи?

Ответы [ 2 ]

3 голосов
/ 03 апреля 2012

Вам будет лучше использовать awk. Рассмотрим этот сценарий:

awk '/^#/ {gsub("#", "", $0); txt=$0} {gsub("Linux", txt, $0); print}' file.txt
2 голосов
/ 03 апреля 2012

Вот решение sed:

sed '
/^#.*#$/{                      # if replacement text is matchd
s/#//g                           # remove all pound chars
h                                # copy pattern space to hold space
d                                # delete pattern space and start over
}                              # end if
:a                             # create label "a"
G                              # append hold to pattern
s/Linux\(.*\)\n\(.*\)/\2\1/    # replace Linux with contents of hold space
ta                             # if above replacement succeeded, go to "a"
s/\n.*//                       # remove replacement text and print pattern space
' file.txt

Однострочник, если вы можете использовать ; для разделения команд:

sed '/^#.*#$/{s/#//g;h;d};:a;G;s/Linux\(.*\)\n\(.*\)/\2\1/;ta;s/\n.*//' file.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...