Решение sed, главным образом для иллюстрации того, что sed, вероятно, не лучший выбор для этого:
$sed -E '1{h;b};/^$/{n;h;b};G;s/^(.*)(.*)\n\1$/\2/' infile
bar
fo
foo
fooo
foooo
sample
Text1
Text2
Text3
prefix
FooBar
BarFoo
Вот как это работает:
1 { # on the first line
h # copy pattern buffer to hold buffer
b # skip to end of cycle
}
/^$/ { # if line is empty
n # get next line into pattern buffer
h # copy pattern buffer to hold buffer
b # skip to end of cycle
}
G # append hold buffer to pattern buffer
s/^(.*)(.*)\n\1$/\2/ # substitute
Сложная частьв замене.Перед заменой буфер шаблона содержит что-то вроде этого:
prefixFooBar\nprefix
Подстановка теперь соответствует двум группам захвата, на первую из которых ссылается то, что находится между \n
и концом строки - префиксмы извлекаемся из буфера хранения.
Затем выполняется замена остальной части исходной строки с удаленным префиксом.
Примечания:
- Это работает с GNUСЭД;более старая версия GNU sed может потребовать
-r
вместо -E
-E
только для удобства;без него подстановка выглядела бы как
s/^\(.*\)\(.*\)\n\1$/\2/
, но все еще работала.
Для macOS sed она работает с буквальными переносами строк между командами:
sed -E '1{
h
b
}
/^$/{
n
h
b
}
G
s/^(.*)(.*)\n\2$/\2/' infile