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
вместо него. Вы также можете вставить несколько %m
s - что вы можете сделать, если хотите, чтобы линии типа 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
, на которой будет напечатана строка и вытянута n
ext и т.д.
Если бы я вместо этого сделал -
, то это генерировало бы функцию, подобную описанной выше - каждая из которых имела бы свою собственную уникальную этикетку :
- для каждого месяца в пределах диапазона. Это означает, что аргументы командной строки имеют кумулятивный эффект. Некоторые примеры:
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]
Я не уверен, что я знаю, что я делаю. Любые комментарии или предложения будут оценены.
$ 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
$