У меня есть строка ввода, как:
arg1.arg2.arg3.arg4.arg5
Я хочу получить вывод:
arg5.arg4.arg3.arg2.arg1
Это не всегда 5 аргументов, может быть от 2 до 10.
Как я могу сделать это в скрипте bash?
shell
text-processing
Jens
источник
источник
Если вы не возражаете против чуть-чуть
python
:Пример:
s.split(".")
генерирует список, содержащий.
разделенные подстроки,[::-1]
переворачивает список и".".join()
соединяет компоненты обратного списка с помощью.
.источник
Вы можете сделать это с помощью одного
sed
вызова:он использует буфер удержания, чтобы получить начальную новую строку в пространстве шаблона, и использует его для выполнения перестановок, пока за новой строкой больше не следует никакая точка, в которой он удаляет ведущую точку из пространства шаблона и заменяет новую строку точкой.
С BRE и немного другим регулярным выражением:
Если вход состоит из более чем одной строки, и вы хотите изменить порядок в каждой строке:
источник
SED решение:
источник
С
zsh
:Чтобы сохранить пустые элементы:
s:.:
: разделить на.
Oa
: Сортировать массив в обратном rray Indice о rderj:.:
: Присоединиться на.
.@
: do-"$@"
like расширение, когда в двойных кавычках, поэтому расширение не подвергается пустому удалению.POSIX (или
bash
) эквивалент может быть что-то вроде:(обратите внимание, что
zsh
(вsh
эмуляции)yash
и некоторыеpdksh
оболочки на основе не являются POSIX в этом отношении в том смысле, что они рассматриваются$IFS
как разделитель полей вместо разделителя полей)Отличие от некоторых других решений, приведенных здесь, заключается в том, что он не обрабатывает символ новой строки (и, в случае
zsh
NUL), в частности, то есть$'ab.cd\nef.gh'
обратный$'gh.cd\nef.ab'
, нет$'cd.ab\ngh.ef'
или$'gh.ef.cd.ab'
.источник
IFS="."; set -f; set -- $string$IFS; for i; do rev="$i$IFS$rev"; done; printf '%s\n' "${rev%$IFS}"
?for i; do
не POSIX (пока), даже если он поддерживается всеми известными мне оболочками POSIX). Просто это решение является прямым переводомzsh
(разделение на массив, обратный массив, объединение элементов массива), но с использованием операторов только POSIX. (Я изменил ,string=$string$IFS; set -- $string
чтобы ,set -- $string$IFS
как кажется, работают последовательно через оболочки, спасибо).Я вижу, что Рахул уже опубликовал собственное решение для bash (среди прочего), которое является более короткой версией первого, который я придумал:
но я не мог на этом остановиться и почувствовал необходимость написать рекурсивное решение, ориентированное на bash:
источник
Не видел
awk
ответа, поэтому вот один:источник
Pure Bash, требует завершающего периода на входе:
Используйте,
printf %s "$g"
если любой из пунктирных элементов может начинаться с дефиса.источник