I created the following рукописный шрифт:
#!bin/bash
cat > Top10 <<EOF
Linux Mint 17.2
Ubuntu 15.10
Debian GNU/Linux 8.2
Mageria 5
Fedora 23
openSUSE Leap 42.1
Arch Linux
CentOS 7.2-1511
PCLinuxOS 2014.12
Slackware Linux 14.1
FreeBSD
EOF
sed -ri "s/^[^0-9]*$//" Top10
sed -r "s/(.*)([[:space:]][[:digit:]]*.*)$/\2\1/" Top10 | sed -r "s/([[:space:]])([[:digit:]])/\2/" | sed -r "s/([[:digit:]])([[:alpha:]])/\1 \2/" > Top10
sed -r -i "s/(.*)/\L\1/" Top10
sed -r -i "y/[aeiou]/[AEIOU]/" Top10
sort Top10 -g -o Top10
cat Top10
When I run it в few укради the following happens:
Эксперт you хан see sometimes the Top10 file turns out empty and sometimes it turn out the way I needed it to be. I know that the command which ты повторно нравишься the extensions from the end to the front of в line is подарите poorly. I ran this рукописный шрифт on в виртуальный VMware machine. Could that be the reason?
В частности, трубы не являются детерминированными.
Т.е. в канале вроде этого:
command1 file | command2 | command3 >file
не гарантируется, что файл command1
будет выполнен до command3> file
.
Таким образом, состояние гонки между файлом command1
и command3> file
делают так, что иногда файл сначала читается command1 file
, а иногда файл сначала усекается command3> file
, выдача ожидаемого результата в первом случае и пустого вывода во втором случае.
Это можно исправить, используя sponge
(в пакете moreutils
) для записи вывод в файл, чтобы убедиться, что вывод записывается в файл только после того, как остальная часть конвейера завершила выполнение:
command1 file | command2 | command3 | sponge file
sed -r "s/(.*)([[:space:]][[:digit:]]*.*)$/\2\1/" Top10 | sed -r "s/([[:space:]])([[:digit:]])/\2/" | sed -r "s/([[:digit:]])([[:alpha:]])/\1 \2/" > Top10
заставляет файл сначала перезаписывать > Top10
и только затем обрабатывать sed
(в это время файл пуст)
Нет причин запускать 6 команд sed, когда вы можете сделать это в одном:
sed -ri 's/^[^0-9]*$//; s/(.*)/\L\1/; y/[aeiou]/[AEIOU]/; s/(.*)([[:space:]])([[:digit:]]*.*)$/\3 \1/' Top10
Обратите внимание, в частности, как второй конвейер команд sed может быть объединен в одно выражение, если вы просто сгруппировали свои совпадения по-другому. Поскольку вы все равно хотели отбросить ведущий пробел, а затем добавить пробел после версии, вы можете сделать это в самом исходном совпадении, сгруппировав ведущий пробел и версию отдельно.