Como trocar as primeiras letras de duas palavras?

4
$ echo 'foo bar' | sed SOMEMAGIC
boo far
$ echo 'one two' | sed SOMEMAGIC
tne owo

Q: em geral, como posso substituir o "b" da "barra" pelo "f" do "foo"? E em sentido inverso, substitua o "f" do "foo" pelo "b" da "barra".

    
por evachristine 21.03.2014 / 08:39

4 respostas

6

Você precisa fazer uso de grupos de captura. Capture (1) a primeira letra de uma palavra, (2) tudo até a primeira letra da segunda palavra, (3) a primeira letra da segunda palavra e troque (3) e (1).

Nos exemplos abaixo, é assumido que a linha começa com um caracter não-branco

Você poderia dizer:

sed 's/\(.\)\([^ ]* \)\(.\)//'

ou

sed -r 's/(.)([^ ]* )(.)//'

Por exemplo,

$ echo 'foo bar' | sed -r 's/(.)([^ ]* )(.)//'
boo far
$ echo 'one two' | sed -r 's/(.)([^ ]* )(.)//'
tne owo

O seguinte também lida com casos como espaços no início da linha e vários espaços entre as duas palavras:

sed -r 's/([^ ])([^ ]* +)(.)//'

Uma expressão perl correspondente seria:

perl -pe 's/(\S)(\S+\s+)(\S)/$3$2$1/'

Exemplos:

$ echo 'one two' | perl -pe 's/(\S)(\S+\s+)(\S)/$3$2$1/'
tne owo
$ echo 'one two' | perl -pe 's/(\S)(\S+\s+)(\S)/$3$2$1/'
tne owo
$ echo 'foo bar' | perl -pe 's/(\S)(\S+\s+)(\S)/$3$2$1/'
boo far
$ echo '   one     two' | perl -pe 's/(\S)(\S+\s+)(\S)/$3$2$1/'
   tne     owo
    
por 21.03.2014 / 08:49
2
one=word ; two=phrase ; three=$one
one="${two%"${two#?}"}${one#?}"  
two="${three%"${three#?}"}${two#?}"
echo "$one $two"
> pord whrase
    
por 22.03.2014 / 00:45
1

Uma possível solução em awk :

echo 'foo bar' | awk '{x=substr($1,1,1); y=substr($2,1,1); sub(x, y, $1); sub(y, x, $2); print $0}'
boo far

As duas chamadas de função substr extrairão o primeiro caractere de cada um dos registros e as duas chamadas para a função sub substituirão a primeira aparição desses caracteres entre si.

    
por 22.03.2014 / 01:29
1

com sed:

echo 'one two' |sed -re 's/([^ ])([^ ]+)( +)([^ ])([^ ]+)//'
tne owo

corresponde também a espaços variáveis.

    
por 22.03.2014 / 00:16

Tags