Я не знаю, откуда вы взяли «условное условие», потому что в вашем утверждении нет никаких условных выражений. awk -F- {print}
не делает ничего полезного; просто передавая вход на выход.
Однако вы можете делать то, что хотите, с sed
выражением, чтобы упростить весь конвейер:
sed -n 's/.*\.[^-]*-\(.*\)/\1/p'
-n
и p
означают, что будут напечатаны только те строки, которые соответствуют выражению.
Выражение удалит до последнего .
, а затем удалит все до первого -
.
Так:
% echo 111.2222.333-ab3-On21-2 | sed -n 's/.*\.[^-]*-\(.*\)/\1/p'
ab3-On21-2
% echo 111.2222.333 | sed -n 's/.*\.[^-]*-\(.*\)/\1/p'
%
Если ввод более сложный, (например, может быть четыре .
поля с разделителями ), тогда шаблон может быть немного более продуманным.
sed -n 's/.*\.[^-]*-\([^\.]*\).*/\1/p'
например,
% echo 111.2222.333-ab3-On21-2.999 | sed -n 's/.*\.[^-]*-\([^\.]*\).*/\1/p'
ab3-On21-2
grep -o -P '[^.]*\.[^.]*\.[^-]*-\K.*'
Сначала я подумал об использовании положительного просмотра назад, но он не работал с регулярными выражениями -фиксированной -длины. Затем я немного погуглил и обнаружил, что у Perl есть токен \K
для сброса соответствия.
Примеры:
grep -o -P '[^.]*\.[^.]*\.[^-]*-\K.*' <<< 111.222.333-ab3-0n21-2
ab3-0n21-2
grep -o -P '[^.]*\.[^.]*\.[^-]*-\K.*' \
<<< '128-2sd83--.3 832 @!@!# 323.7 dskj...-ab3-0n21-2'
ab3-0n21-2
Используя cut
,с опцией-s
(или--only-delimited
):
printf '%s\n' '111.2222.333-ab3-On21-2' '111.2222.334' |
cut -d '.' -f 3 | cut -d '-' -sf 2-
Выход:
ab3-On21-2