как подражать «замените abb a» на sed?

Я пытаюсь эмулировать команду replace, которая меняет местами два символа с помощью сценария sed, но очевидный выбор:

sed -e 's/a/b/g' -e 's/b/a/g' 

не работает. Можете ли вы указать мне, как это сделать правильно?

Я бы использовал команду translate tr eg.

 tr ab ba < input_file 

Если вы хотите заменить отдельные символы , а не больше строк, используйте

 sed -e 'y/ab/ba/' 

или эквивалентную команду tr из ответа X Tian. Для произвольных строк вам нужно больше работать:

Если на входе присутствует какой-либо символ, который, конечно же, не встречается, например # (даже персонаж управления), вы можете использовать что-то вроде

 sed -e 's/a/#/g;s/b/a/g;s/#/b/g;' 

Кроме того, вы можете сделать некоторые трюки с префиксом:

 sed -e ' s/a/xa/g; s/b/xb/g; s/xa/yb/g; s/xb/ya/g; s/ya/a/g; s/yb/b/g; ' 

то есть: префикс каждые a и b с x (что означает: еще не изменено), замените xa на yb и наоборот (где y означает: изменено) и удалите все префиксы.

Если у вас есть запасной персонаж, вы можете сделать предложение Уве.

Если вам действительно нужно заменить только один символ, и вам не обязательно нужен sed , используйте tr как предложено XTian.

Если вам не нужен sed и вы можете заменить более длинные последовательности, не требуя запасного персонажа, вы можете пойти с чем-то вроде этого:

 perl -le '%ex=(a=>"b",b=>"a"); $keys=join("|",keys(%ex)); $text="abba"; $text=~s/$keys/$ex{$&}/eg; print $text' 

или

 ruby -e 'ex={"a"=>"b","b"=>"a"}; puts "abba".gsub(/(#{ex.keys.join("|")})/,ex)'