Быстрый способ вернуть слова в предложении в Unix? - PullRequest
0 голосов
/ 21 февраля 2012

Мне нужно что-то, что переворачивает слова в предложении в обратном порядке. Я уверен, что можно обойтись без написания сценария.

Что-то, что получает входной поток, такой как echo AAaa BBbb CCcc | foo и печатает CCcc BBbb AAaa

Извините, я изменил пример, сами слова не должны быть возвращены. Итак, rev не работает

Ответы [ 6 ]

6 голосов
/ 21 февраля 2012

хорошо, когда я увидел этот вопрос, я тоже подумал tac или rev. однако я думаю, что OP сделал плохой пример с AAA BBB. он может захотеть вернуть слово "слово", но не все символы.

посмотри, если это то, что ты хочешь:

kent$  echo "this is another test example"|awk '{for(i=NF;i>0;i--)printf $i" "}'
example test another is this      
5 голосов
/ 21 февраля 2012

Да, его есть rev:

~ $ echo AAA BBB CCC DDD | rev
DDD CCC BBB AAA
~ $ 

EDIT:

Хорошо, вы также можете попробовать использовать tac следующим образом:

~ $ echo -n "AAaa BBbb CCcc DDdd " | tac -s ' '
DDdd CCcc BBbb AAaa ~ $

Единственная проблема - он не отображает новую строку в конце строки.

4 голосов
/ 21 февраля 2012
echo AAaa BBbb CCcc | tr ' ' '\n' | tac | tr '\n' ' '
2 голосов
/ 21 февраля 2012
tac AAAA BBBB CCCC

Попробуйте это!

1 голос
/ 22 февраля 2012

Загадочная версия usind sed, работающая с многострочным вводом и пробелами между словами и в начале / конце строки:

echo -e "  AAaa     BBbb CCcc\nZ Y X" | sed -e 'G;:a;s/^\([^ ]*\) \(.*\)\n\(.*\)$/\2\n \1\3/;ta;s/\n//'

Что она делает:

  1. Добавить новую строку в конце строки (команда G),
  2. Поставить 1-е слово сразу после новой строки (команда big s),
  3. Переходите к предыдущему, пока есть слова,
  4. Удалите новую строку между последним словом (которое теперь является 1-м) и остальной частью предложения.
0 голосов
/ 22 февраля 2012

В чистом bash, поэтому без необходимости в подпроцессе и работы с многострочным вводом, подобным решению awk, но не работает, если много слов между словами в начале / конце строки: - (:

function revert_line_in() {
  test $# -eq 0 && return
  test $# -eq 1 && echo -n "$1"
  test $# -eq 1 || { local word=$1; shift; revert_line_in $@; echo -n " $word"; }
}

function revert_line() {
  while read line; do revert_line_in $line; echo; done
}

echo -e "    AAaa   BBbb CCcc\nthis is another test example" | revert_line

revert_line <<< "AAaa BBbb CCcc
this is another test example"

revert_line < file

Обратите внимание на ключевое слово local в функции, которая объявляет локальную переменную. Если опущено, решение ломается.

...