Как я могу выполнить и экспортировать в одном сценарии оболочки

mrng(){ sed "$(set -f;unset IFS rng l;n=' 
';[ -n "$ZSH_VERSION" ] && emulate sh                
prng()  for m do rng=${r%%"$m"*}${r##*"$m"} _l=$((_l+1))
                 printf "\n\n%s\n/$pat/{\n\t:$l.$_l\n\tn" $m
                 printf "\n\n%s\n\t/$pat/b$l.$_l.0" $rng
                 printf "\n\tb$l.$_l\n\t:$l.$_l.0\n}"
        done                                        
pat=$(  printf %s "${1:-%m}$n"| sed -n 's/%/&&/g;l'|
        sed ":n$n\$!N;s/\\\\\n//;tn${n}s/\$$//"); shift
r=$(    locale -c LC_TIME|sed '4!d;y/;/ /')       
for m do case   $m      in      (-)     rng=$r  ;;
        (-*)    rng=${r%%"${m#-}"*}${m#-}       ;;
        (*-)    rng=${m%-}${r##*"${m%-}"}       ;;     
        (*-*)   rng=${m%%-*}${r##*"${m%%-*}"}   ;        
                case    $rng    in      (*${m##*-}*)     
                rng=${rng%%"${m##*-}"*}${m##*-}  ;;(*)   
                rng=$rng\ ${r%%"${m##*-}"*}${m##*-};;esac
        ;;esac; : $((l+=1))                                                
        prng    ${rng:="$m"}; unset rng                                    
done|   sed "   1d;s/.*\(...\)\(\n\)\(.*[^%]\(%%\)*\)%m/\2\1\2\3\1/
                /./!{N;N$n};/\n/D"
);d"       
}

Это функция оболочки - вам нужно либо адаптировать ее в сценарий оболочки, если вы планируете ее вызывать, либо оценить в текущей оболочке. Вы можете вызвать ее как:

mrng "$pat" Jan-Mar Jun Sep-Nov <infile

Она также принимает открытые диапазоны, такие как -, чтобы означать all или Mar-, чтобы означать с марта по декабрь. И аргументы не имеют значения диапазонов - как было сказано выше, Jun - это нормально.

На самом деле, на самом деле, он вообще не интерпретирует названия месяцев - он собирает их из утилиты локали (что является зависимостью) и работает с тем, что бы ни говорила текущая локаль о названиях 3-х знаковых месяцев.

Она может делать обходные диапазоны, и, на самом деле, почти все из них на самом деле делают обходные, или, может быть, лучше сказать, накапливают, так или иначе.

Он ожидает, что его первым аргументом будет sed совместимый паттерн BRE - за исключением того, что где бы вы ни ожидали встретить название месяца, вы должны использовать %m вместо него. Вы также можете вставить несколько %ms - что вы можете сделать, если хотите, чтобы линии типа Mar...Mar - Jun...Jun совпадали только с линиями типа Mar...Jun...Jun. Наверное, это не так уж и полезно, но может быть...?

Хотя это выглядит сложным, больше половины из них посвящено аргументированию - sed все-таки относительно просто. Например, если я сделаю:

mrng %m Dec-Jan

...он сгенерирует скрипт sed, который выглядит как:

/Dec/{
        :1.1
        n
        /Jan/b1.1.0
        /Feb/b1.1.0
        /Mar/b1.1.0
        /Apr/b1.1.0
        /May/b1.1.0
        /Jun/b1.1.0
        /Jul/b1.1.0
        /Aug/b1.1.0
        /Sep/b1.1.0
        /Oct/b1.1.0
        /Nov/b1.1.0
        b1.1
        :1.1.0
}
/Jan/{
        :1.2
        n
        /Feb/b1.2.0
        /Mar/b1.2.0
        /Apr/b1.2.0
        /May/b1.2.0
        /Jun/b1.2.0
        /Jul/b1.2.0
        /Aug/b1.2.0
        /Sep/b1.2.0
        /Oct/b1.2.0
        /Nov/b1.2.0
        /Dec/b1.2.0
        b1.2
        :1.2.0
};d

...который в итоге получит много кода, но большая часть которого большую часть времени не оценивается. На типичной строке он будет проверять, соответствует ли он Dec, и, если нет, если он соответствует Jan, и, если нет, удалить его из вывода.

Но как только она совпадёт с одним из этих шаблонов, она начнёт простой цикл ветвей. Таким образом, в приведённом примере, если строка совпадает с Dec, то она будет выведена на печать и перезаписана внешней входной строкой n. Если новая строка совпадает с любым месяцем , но Dec, sed b ранчо с меткой :1.1.0 - это значит, что строка ещё не была вычислена против Jan - где она получит аналогичную обработку - но не будет вычислена против любого месяца до Dec. Если он не совпадает ни с одним месяцем, кроме декабря, то sed b ranches до метки :1.1, на которой будет напечатана строка и вытянута next и т.д.

Если бы я вместо этого сделал -, то это генерировало бы функцию, подобную описанной выше - каждая из которых имела бы свою собственную уникальную этикетку : - для каждого месяца в пределах диапазона. Это означает, что аргументы командной строки имеют кумулятивный эффект. Некоторые примеры:

printf %s\\n 'not a month' May 'not a month' 'also not a month' Apr |
m_rng %m Apr May

Вышеуказанное печатает:

May
not a month
also not a month

Потому что Май на входе стоит перед Apr, но после Apr в командной строке. Однако, это довольно грубая эвристика. Вход обрабатывается в порядке аргументов командной строки, но как только полный цикл сделан, обработка начинается заново, так что....

printf %s\\n 'not a month' May 'not a month' 'also not a month' Jun Apr |
m_rng %m Apr May

... печатает...

May
not a month
also not a month
Apr

Поскольку цикл разрывается на Jun, строка удаляется, и обработка снова начинается сверху ж/д следующей входной строки - Апрель.

В любом случае, для вашего шаблона вы должны использовать:

mrng '^\([^ ]\{1,\}  *\)\{3\}%m' [month args]
-1
13.05.2015, 05:52
1 ответ

Я не уверен, что я знаю, что я делаю. Любые комментарии или предложения будут оценены.

$ cat java7
#!/bin/sh
alternative=java-7-oracle
sudo update-java-alternatives -s $alternative
export JAVA_HOME=/usr/lib/jvm/$alternative

$ cat java8
#!/bin/sh
alternative=java-8-oracle
sudo update-java-alternatives -s $alternative
export JAVA_HOME=/usr/lib/jvm/$alternative

$ . java7;javac -version;echo $JAVA_HOME
javac 1.7.x_yy
/usr/lib/jvm/java-7-oracle

$ . java8;javac -version;echo $JAVA_HOME
javac 1.8.x_yy
/usr/lib/jvm/java-8-oracle

Обновление

Я обновляю для себя и любому, кто нуждается.

Сначала я добавил следующую строку на мой ~ / .bashrc .

#http://serverfault.com/a/276221/113357
export JAVA_HOME=$(readlink -f /usr/bin/java | sed "s:bin/java::")

и мой новый ~ / bin / java_home скрипты.

#!/bin/bash
if [ $# -ne 1 ]
then
    echo please select a jname.
    update-java-alternatives -l
    return;
fi
jname=$1
sudo update-java-alternatives -s $jname
source ~/.bashrc

И когда я хочу изменить JDK, я делаю.

$ source java_home java-7-oracle
$ source java_home java-8-oracle

Java_Home переменные изменения даже на любых новых клеммах. Предыдущая Java7 и java8 изменилось так.

$ echo java7
#!/bin/sh
source java_home java-7-oracle

$ echo java8
#!/bin/sh
source java_home java-8-oracle

$
0
28.01.2020, 05:13

Теги

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