Если бы Вы не можете использовать Augeas и Марионетку, вот то, что я сделал бы:
if grep -qF '^/export/home' /etc/exports;then
sed -i \
's@^/export/home.*$@/export/home 2400:123::/32(rw,no_root_squash)@'\
/etc/exports
else
echo '/export/home 2400:123::/32(rw,no_root_squash)' >> /etc/exports
fi
Осторожный, хотя: это предполагает что любое правило для экспорта /export/home
справедливая игра для того, чтобы быть замененным по Вашему данному определению.
Я предпочитаю вариант не изменить существующие данные, но добавляя критерии сортировки в качестве нового столбца, и удаляя это вспомогательное поле сортировки в конце трубы:
awk -F, 'BEGIN {u["kg"]=1000; u["g"]=1}; {print $1*u[$2], $0}' file |
sort -n | cut -d" " -f2-
Если ваш файл слишком большой, чтобы удержаться в памяти, вы можете сделать:
$ awk -F, -v OFS="," '$2=="kg"{$1=1000*$1}1;' file | sort -n |
awk -F, -v OFS="," '$2=="kg"{$1=$1/1000}1;'
1000,g,dog
1,kg,cat
20,g,apple
Вам может быть лучше преобразовывать блоки в файл, сортировать их и использование полученного хранения файл.
sed -r 's/^([0-9]+),kg/\1000,g/' $file | sort -n
SED
не понимает математику, поэтому, если у вас нет инкайдеров, вам придется использовать что-то еще. Ниже приведено быстрый разбор с SED, но использует BC
, чтобы сделать фактическую математику, если это необходимо.
sed -r 's/^([0-9]+),kg/\1000,g/;s/^([0-9\.]+),kg/echo $(echo \1*1000 | bc),g/e'