Somehow I created в nondeterministic sh рукописный шрифт

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?

2
задан 9 January 2016 в 19:39

3 ответа

В частности, трубы не являются детерминированными.

Т.е. в канале вроде этого:

command1 file | command2 | command3 >file

не гарантируется, что файл command1 будет выполнен до command3> file .

Таким образом, состояние гонки между файлом command1 и command3> file делают так, что иногда файл сначала читается command1 file , а иногда файл сначала усекается command3> file , выдача ожидаемого результата в первом случае и пустого вывода во втором случае.

Это можно исправить, используя sponge (в пакете moreutils ) для записи вывод в файл, чтобы убедиться, что вывод записывается в файл только после того, как остальная часть конвейера завершила выполнение:

command1 file | command2 | command3 | sponge file
5
ответ дан 3 December 2019 в 06:21
sed -r "s/(.*)([[:space:]][[:digit:]]*.*)$/\2\1/" Top10 | sed -r "s/([[:space:]])([[:digit:]])/\2/" | sed -r "s/([[:digit:]])([[:alpha:]])/\1 \2/" > Top10

заставляет файл сначала перезаписывать > Top10 и только затем обрабатывать sed (в это время файл пуст)

2
ответ дан 3 December 2019 в 06:21

Нет причин запускать 6 команд sed, когда вы можете сделать это в одном:

sed -ri 's/^[^0-9]*$//; s/(.*)/\L\1/; y/[aeiou]/[AEIOU]/; s/(.*)([[:space:]])([[:digit:]]*.*)$/\3 \1/' Top10

Обратите внимание, в частности, как второй конвейер команд sed может быть объединен в одно выражение, если вы просто сгруппировали свои совпадения по-другому. Поскольку вы все равно хотели отбросить ведущий пробел, а затем добавить пробел после версии, вы можете сделать это в самом исходном совпадении, сгруппировав ведущий пробел и версию отдельно.

2
ответ дан 3 December 2019 в 06:21

Другие вопросы по тегам:

Похожие вопросы: