sed 'expression;expression'
совпадает с
sed -e 'expression' -e 'expression'
, что в некоторых простых случаях совпадает с
sed -e 'expression' | sed -e 'expression'
В вашем случае (из того, что я вижу ), вы пытаетесь изменить все &
на <
. Затем все <
в новые строки, а затем, наконец, вы добавляете <
в начало строк:
s/\&/\</g;s/\</\
/g;s/^/\</g
С заданным вводом этот sed
скрипт выполнит следующие действия с BSDsed
:
$ sed -f script.sed file
<
<
<
<
Или с GNUsed
:
$ gsed -f script.sed file
<
<
str
<
int
<
int
Почему это?
&
\
перед &
можно дополнительно опустить ), поэтому первое выражение — это no -op. \<
, которое является (началом границы )слова. Честно говоря, я немного озадачен тем, почему текст удаляется BSD sed
(. Я посмотрю, является ли это ошибкой OpenBSD sed
). Так что это вставляет новую строку в начале каждого слова файла примера. <
в начале строки. В отличие от этого, единственное выражение s/^/\</g
(, в котором \
перед <
и модификатор g
не нужны ), будет просто вставлять <
в начале каждого линия.
Следуйте за -вверх :Было подтверждено, что в sed
реализации на OpenBSD 6.1 -была ошибка, связанная с добавлением строки перед строкой, начинающейся со вставленной новой строки. Патч отправлен.
Использование Perl:
perl -lne 'print "\n$_" if /interface/; print if / ip./' file
Использование awk:
awk '/interface/{print "\n"$0} / ip./' file
interface Loopback0
ip address 10.1.1.11 255.255.255.255
interface FastEthernet0/0
ip address 10.0.12.1 255.255.255.0
interface FastEthernet0/1
ip flow monitor all-traffic-monitor output
ip address 10.0.100.1 255.255.255.0
interface Ethernet1/0
ip address 10.0.13.1 255.255.255.0
ip helper-address 10.1.1.1
ip helper-address 10.1.1.2