Могу ли я заменить несколько символов в ed?

Проблема с вашей командой заключается в том, что даже с установленным флагом g, определенная часть текста, который нужно сопоставить, может быть включена только в одиночное сопоставление. Поскольку .* является жадным, в итоге вы удалите только последний символ трубы. Не говоря уже о том, что пробел в тексте замены находится в неправильном месте.

Вы можете сделать это с помощью повторяющейся команды s в цикле, выполняемой до тех пор, пока она не перестанет соответствовать чему-либо. Например, так:

sed -e ':looplabel' -e 's/\(START.*\)|\(.*|\[END\)/\1 \2/;t looplabel'

Или, используя более короткую метку цикла:

sed -e ':t' -e 's/\(START.*\)|\(.*|\[END\)/\1 \2/;tt'
1
30.04.2019, 05:13
3 ответа

Не изначально, нет --в нем отсутствует команда транслитерации, которую вы видите в sed(y)и perl (tr///, она же y///)--, но вы можете подделать ее с помощью самой команды trанлитерации:

ed -s input <<< $'e !tr ab ba < %\nw\nq'

Команда eзаменяет содержимое файла результатами команды выхода оболочки; эта команда транслитерирует a в b и b в a и получает текущее имя файла в качестве входных данных. Затем новый файл wзаписывается на диск; то мы qподходим к изд.

1
27.01.2020, 23:22

Вы делаете это так же, как меняет местами две переменные в CилиBASIC:tmp = a; a = b; b = tmp;-)

Пример:

p
foobar
s/foo/FOO/
s/bar/foo/
s/FOO/bar/
p
barfoo

Замените FOOвыше любым символом или текстом, которого нет в вашей строке.

1
27.01.2020, 23:22

Не "одновременно", а в несколько шагов.

Первый шаг — пометить все, что нужно изменить.

Второй шаг — изменить все теги 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.

1
27.01.2020, 23:22

Теги

Похожие вопросы