Проблема с вашей командой заключается в том, что даже с установленным флагом g
, определенная часть текста, который нужно сопоставить, может быть включена только в одиночное сопоставление. Поскольку .*
является жадным, в итоге вы удалите только последний символ трубы. Не говоря уже о том, что пробел в тексте замены находится в неправильном месте.
Вы можете сделать это с помощью повторяющейся команды s
в цикле, выполняемой до тех пор, пока она не перестанет соответствовать чему-либо. Например, так:
sed -e ':looplabel' -e 's/\(START.*\)|\(.*|\[END\)/\1 \2/;t looplabel'
Или, используя более короткую метку цикла:
sed -e ':t' -e 's/\(START.*\)|\(.*|\[END\)/\1 \2/;tt'
Не изначально, нет --в нем отсутствует команда транслитерации, которую вы видите в sed(y
)и perl (tr///
, она же y///
)--, но вы можете подделать ее с помощью самой команды tr
анлитерации:
ed -s input <<< $'e !tr ab ba < %\nw\nq'
Команда e
заменяет содержимое файла результатами команды выхода оболочки; эта команда транслитерирует a в b и b в a и получает текущее имя файла в качестве входных данных. Затем новый файл w
записывается на диск; то мы q
подходим к изд.
Вы делаете это так же, как меняет местами две переменные в C
илиBASIC
:tmp = a; a = b; b = tmp
;-)
Пример:
p
foobar
s/foo/FOO/
s/bar/foo/
s/FOO/bar/
p
barfoo
Замените FOO
выше любым символом или текстом, которого нет в вашей строке.
Не "одновременно", а в несколько шагов.
Первый шаг — пометить все, что нужно изменить.
Второй шаг — изменить все теги a
на b
.
Третий шаг — изменить все теги b
на a
.
Тогда возникает вопросhow can I tag the things to change?
Существует интересный метод, который говорит, что вы можете использовать буквуa
(один из двух символов, которые вы хотите поменять местами ), чтобы пометить.
s/[ab]/a&/g
s/aa/b/g
s/ab/a/g
Для этого входа
aaaa aaab aaba aabb abaa abab abba abbb baaa baab baba babb bbaa bbab bbba bbbb
шаги производят
aaaaaaaa aaaaaaab aaaaabaa aaaaabab aaabaaaa aaabaaab aaababaa aaababab abaaaaaa abaaaaab abaaabaa abaaabab ababaaaa ababaaab abababaa abababab
bbbb bbbab bbabb bbabab babbb babbab bababb bababab abbbb abbbab abbabb abbabab ababbb ababbab abababb abababab
bbbb bbba bbab bbaa babb baba baab baaa abbb abba abab abaa aabb aaba aaab aaaa
что является желаемым результатом.
Очевидно, если есть символ, которого заведомо нет во вводе, например ctrl -A, вы также можете сделать изменение в 3 шага, сначала изменить все a
на ctrl-A
, затем изменить все b
на a
, а затем измените все ctrl-a
на b
.