Команда sed для замены первого и последнего символа каждой строки

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

 sed 's/\(.\)\(.+\)\(.\)/\3\2\1/' input.txt

Я даже пытался добавить символы начала и конца строки.

 sed 's/^\(.\)\(.+\)\(.\)$/\3\2\1/' input.txt

Кажется, в файле ничего не совпадает.


person dharakk    schedule 08.09.2014    source источник


Ответы (4)


Вам нужно сбежать от +,

sed 's/^\(.\)\(.\+\)\(.\)$/\3\2\1/' input.txt
person Avinash Raj    schedule 08.09.2014
comment
Или используйте sed -r и удалите косую черту из символов ( и ). - person Etan Reisner; 08.09.2014
comment
Параметр -r не будет поддерживаться на некоторых sed. - person Avinash Raj; 08.09.2014
comment
Абсолютно верно (относительно переносимости `-r), но, тем не менее, это допустимая альтернатива. - person Etan Reisner; 08.09.2014

Если вы хотите попробовать что-то другое, вот gnu awk версия

awk '{a=$1;$1=$NF;$NF=a}1' FS= OFS= input.txt

Это устанавливает a на первый символ, затем устанавливает первый на последний и последний на a
Требуется gnu awk, так как настройки FS на ничего не соответствуют стандарту awk

person Jotne    schedule 08.09.2014
comment
хорошо, если мы ничего не даем как FS и OFS, то он считает каждый символ полем? а что делает 1? новая линия? - person dharakk; 08.09.2014
comment
@dharakk 1 отчасти верно, а некоторая истина выполняет действие по умолчанию print the line, поэтому 1={print $0} - person Jotne; 08.09.2014

Это работает портативно:

abcd | sed 's/^\(.\)\(.*\)\(.\)$/\3\2\1/'

вы можете использовать .*. Отпечатки

dbca

также работает с ad, например

echo ad | sed 's/^\(.\)\(.*\)\(.\)$/\3\2\1/'

отпечатки

da

.+ не известен для каждого sed, например. например, это не работало в OS X. Поэтому я рекомендую использовать .* или имитировать .+ с ..*, например

echo ad | sed 's/^\(.\)\(..*\)\(.\)$/\3\2\1/'

отпечатки

ad #not swaps
person jm666    schedule 08.09.2014

echo 'are' | sed 's/\(.\)\(.*\)\(.\)/\3\2\1/' 
  • Нет необходимости в ^ или $, потому что sed по умолчанию берет максимально возможное (поэтому вся строка)
  • используйте * вместо +, потому что с + вам нужна как минимум 3-символьная строка для работы, где 2-символьная строка по-прежнему должна менять местами начало и конец.
person NeronLeVelu    schedule 09.09.2014