С GNU sed
вы можете использовать
sed ':a; s~^\(one\)[/.]\(two[^.]*\)/~\1.\2.~; ta;' file;
Одно предупреждение : оно также будет соответствовать one.two
префиксным строкам.
Или вы также можете использовать
sed 's/^one\/two[^.]*/&\n/;h;y/\//./;G;s/\n.*\n//' file
Это правильно обрабатывает только one/two
строки с префиксами.
Первая команда sed
означает:
:a
- устанавливает метку a
s~^\(one\)[/.]\(two[^.]*\)/~\1.\2.~
- находит следующее: ^
- начало строки \(one\)
- Группа 1 (\1
): one
слово [/.]
- /
или .
\(two[^.]*\)
- Группа 2: two
, затем 0 + символы, отличные от .
, а затем /
- /
char
\1.\2.
- Заменяет значение группы 1 + .
+ Значение группы 2 + .
ta
- метка l oop - :a
, если на предыдущей итерации было совпадение.
Вторая команда sed означает
s/^one\/two[^.]*/&\n/
- замените one/two
+ 0 или более символов, отличных от .
на то же значение (&
), и добавьте новую строку h
- копирует буфер шаблонов в буфер хранения, оставляя буфер шаблонов без изменений y/\//./
- заменяет каждый * 107 4 * с .
G
- добавить пробел к пространству шаблона s/\n.*\n//
- удалить лишний текст между двумя введенными символами новой строки.
См. онлайн sed
демо :
tests="one/two/three.Something one/two/three/four/five.Another"
for test in $tests; do
sed ':a; s~^\(one\)[/.]\(two[^.]*\)/~\1.\2.~; ta;' <<< "$test";
sed 's/^one\/two[^.]*/&\n/;h;y/\//./;G;s/\n.*\n//' <<< "$test"
done;
Вывод:
one.two.three.Something
one.two.three.four.five.Another