Этот ответ основан на неправильном понимании вопроса, но в некоторых случаях он все равно оказывается правильным. Если ввод полностью состоит из натуральных чисел и имеет только один разделитель на -строку, (, как и в примере данных в Q. ), он работает правильно.. Он также будет обрабатывать файлы со строками, каждая из которых имеет собственный разделитель, что немного больше, чем просили.
Эта функция оболочки read
из стандартного ввода использует подстановку параметров POSIX для поиска определенного разделителя в каждой строке, (сохраненную в $d
), и использует tr
для замены $d
с новой строкой \n
и sort
с данными этой строки, затем восстанавливает исходные разделители каждой строки:
sdn() { while read x; do
d="${x#${x%%[^0-9]*}}" d="${d%%[0-9]*}"
x=$(echo -n "$x" | tr "$d" '\n' | sort -g | tr '\n' "$d")
echo ${x%?}
done ; }
Применительно к данным, приведенным в ОП:
printf "%s\n" "10 50 23 42" "10.1.200.42" "1,100,330,42" "400|500|404" | sdn
Выход:
10 23 42 50
1.10.42.200
1,42,100,330
400|404|500
Существует множество приемов, позволяющих заставить скрипты работать как в Windows, так и в Unix, см., например, этот вопрос о stackoverflow.
Пример :поставить :
в начале команды unix, чтобы cmd.exe
пропустить ее, и #
в конце, чтобы оболочка unix не захлебывалась дополнительной кареткой -возврат:
:; echo "unix path = $PATH" > out.lst; exit #
@echo off
echo windows path = %PATH% > out.lst
Если вам нужно несколько строк, вы должны объединить здесь -документ на стороне unix с документом goto label.. : label
на стороне Windows:
:; true <<EOT
@echo off
echo windows path = %PATH% > file.txt
echo windows sux
goto skip
EOT
echo "linux path = $PATH" > file.txt #
echo linux sux #
: skip
Обратите внимание, что <<EOT
должен быть последним в строке, и все строки в части unix должны заканчиваться #
, чтобы не добавлять ложный ^M
в конец строк или имен файлов..