Я только что придумал этот скрипт
while [ $# -gt 0 ]; do
if [[ $1 == *"--"* ]]; then
v="${1/--/}"
declare $v="$2"
fi
shift
done
передайте его как my_script --p_out /some/path --arg_1 5
, а затем в скрипте вы можете использовать $arg_1
и $p_out
.
Поскольку все, что вы делаете, это добавляете два дефиса и отбрасываете несколько дополнительных символов, в date
особой необходимости нет.
$ sed -Ee 's/(Last Password Change: )(....)(..)(..).*Z/\1\2-\3-\4/' < foo.txt
...
Name: cust foo
mail: cust.foo@example.com
Account Lock: FALSE
Last Password Change: 2017-07-21
...
Для более строгого шаблона точки (, соответствующие любому символу ), можно заменить на [0-9]
, чтобы соответствовать только цифрам. \1
и т. д. при замене, конечно, расширяются до того, с чем когда-либо совпадали шаблоны в скобках.
Мне удалось сделать это с помощью следующей awk
команды:
awk -F\: '$1 ~ /Last Password Change/{ OFS=":"; $2 = substr($2, 1, 5)"-"substr($2, 6, 2)"-"substr($2, 8, 2) }1'
Используя :
в качестве разделителя полей, если первый столбец соответствует Last Password Change
, мы будем использовать substr
для извлечения года, месяца и даты и замены второго столбца этими значениями в желаемом формате.
Это мое предложение:
sed -E 's/([0-9]{4})([0-9]{2})([0-9]{2})[0-9]{6}Z/\1-\2-\3/' file
Выход:
Name: cust foo
mail: cust.foo@example.com
Account Lock: FALSE
Last Password Change: 2017-07-21
----------------------------------------
Name: cust xyz
mail: cust.xyz@example.com
Account Lock: TRUE
Last Password Change: 2018-12-10
----------------------------------------
Name: cust bar
mail: cust.bar@example.com
Account Lock: FALSE
Last Password Change: 2017-04-12
----------------------------------------
Name: cust abc
mail: cust.abc@example.com
Account Lock: FALSE
Last Password Change: 2019-10-30
----------------------------------------