Как можно использовать условный оператор в конвейерной команде? [закрыто]

0
29.01.2019, 11:45
3 ответа

Я не знаю, откуда вы взяли «условное условие», потому что в вашем утверждении нет никаких условных выражений. 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
0
28.01.2020, 04:03
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
0
28.01.2020, 04:03

Используя 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
0
28.01.2020, 04:03

Теги

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