Как отменить все слова в файле с bash в Ubuntu?

Я хотел бы отменить полный текст из файла.
Скажем, содержит ли файл:

com.eh/float 

Я хочу получить вывод как:

 float/hecom 

Я попробовал команду:

 rev file.txt 

но у меня есть все обратный выход: taolf/hemoc Есть ли способ получить желаемый результат. Дайте мне знать. Спасибо.
Вот ссылка на файл образца: Sample Text

Можно ли использовать Perl?

 perl -nlE 'say reverse(split("([/.])",$_))' f 

Этот однострочный лоток меняет все линии по f, согласно критериям PO.

Если вы предпочитаете менее родительскую версию:

 perl -nlE 'say reverse split "([/.])"' f 

Вы можете использовать sed и tac :

 str=$(echo 'com.eh/float' | sed -E 's/(\W+)/\n\1\n/g' | tac | tr -d '\n') echo "$str" float/hecom 
  • Используя sed мы вставляем \n до и после всех символов, отличных от слова.
  • Используя tac мы отменяем выходные линии.
  • Используя tr мы снимаем все новые строки.

Если у вас есть gnu-awk, вы можете сделать все это в одной команде awk, используя 4 вызова функции split которые заполняют разделительные строки и разделители отдельно:

 awk '{ s = "" split($0, arr, /\W+/, seps) for (i=length(arr); i>=1; i--) s = s seps[i] arr[i] print s }' file 

Для не-gnu awk вы можете использовать:

 awk '{ r = $0 i = 0 while (match(r, /[^a-zA-Z0-9_]+/)) { a[++i] = substr(r, RSTART, RLENGTH) substr(r, 0, RSTART-1) r = substr(r, RSTART+RLENGTH) } s = r for (j=i; j>=1; j--) s = sa[j] print s }' file 

Для переносимости это можно сделать с помощью любого awk (а не только GNU) с использованием подстрок:

 $ awk '{ while (match($0,/[[:alnum:]]+/)) { s=substr($0,RLENGTH+1,1) substr($0,1,RLENGTH) s; $0=substr($0,RLENGTH+2) } print s }' <<<"com.eh/float" 

Это приводит к тому, что строка захватывает буквенно-цифровые строки плюс следующий символ, изменяя порядок этих двух захваченных fragmentов и добавляя их к выходной строке.

Использование split GNU awk, разделение на разделители . и / , укажите больше, если хотите.

 $ cat program.awk { for(n=split($0,a,"[./]",s); n>=1; n--) # split to a and s, use n from split printf "%s%s", a[n], (n==1?ORS:s[(n-1)]) # printf it pretty } 

Запустить его:

 $ echo com.eh/float | awk -f program.awk float/hecom 

РЕДАКТИРОВАТЬ:

Если вы хотите запустить его как однострочный:

 awk '{for(n=split($0,a,"[./]",s); n>=1; n--); printf "%s%s", a[n], (n==1?ORS:s[(n-1)])}' foo.txt