Пример тестового сценария, который мне подходит:
#!/bin/sh
raw="1F3C6..1F3CA
1F3CF..1F3D3
1F3E0..1F3F0"
for r in $raw
do
f1=`echo "${r}" | cut -d'.' -f1`
f2=`echo "${r}" | cut -d'.' -f2`
f3=`echo "${r}" | cut -d'.' -f3`
echo "field 1:[${f1}] field 2:[${f2}] field 3:[${f3}]"
done
exit
И вывод:
field 1:[1F3C6] field 2:[] field 3:[1F3CA]
field 1:[1F3CF] field 2:[] field 3:[1F3D3]
field 1:[1F3E0] field 2:[] field 3:[1F3F0]
Редактировать
После прочтения комментария Stéphane Chazelas и ссылки на вопросы и ответы я повторно -написал выше, чтобы удалить loop
.
Я не мог придумать, как убратьloop
и части, например, как переменные (; $f1
, $f2
и $f3
в моем первоначальном ответе ), которые можно было передать. Тем не менее я не знаю, что требовалось на выходе в исходном вопросе.
Во-первых, по-прежнему используетсяcut
:
#!/bin/sh
raw="1F3C6..1F3CA
1F3CF..1F3D3
1F3E0..1F3F0"
printf '%s\n' "${raw}" | cut -d'.' -f1,3
Что будет выведено:
1F3C6.1F3CA
1F3CF.1F3D3
1F3E0.1F3F0
Можно заменить отображаемый .
любой строкой, используя --output-delimiter=STRING
.
Далее, с sed
вместо cut
, чтобы обеспечить больший контроль над выходом:
#!/bin/sh
raw="1F3C6..1F3CA
1F3CF..1F3D3
1F3E0..1F3F0"
printf '%s\n' "${raw}" | sed 's/^\(.*\)\.\.\(.*\)$/field 1 [\1] field 2 [\2]/'
И это сделает:
field 1 [1F3C6] field 2 [1F3CA]
field 1 [1F3CF] field 2 [1F3D3]
field 1 [1F3E0] field 2 [1F3F0]
Для реализации GNU Coreutils вы можете использовать
stat --format='%.9Y' file
или просто
stat --format='%.Y' file
Из документации info
:
The ‘%W’, ‘%X’, ‘%Y’, and ‘%Z’ formats accept a precision preceded by a period to specify the number of digits to print after the decimal point. For example, ‘%.3X’ outputs the access timestamp to millisecond precision. If a period is given but no precision, ‘stat’ uses 9 digits, so ‘%.X’ is equivalent to ‘%.9X’. When discarding excess precision, timestamps are truncated toward minus infinity.