처리되는 데이터는 특정 패턴을 따릅니다. 이 경우 세 번째 열에 있는 모든 문자를 분리하고"-"그러나 열에 구분 기호가 있는 경우에만 해당됩니다. 그렇지 않으면 아무것도 반환하지 않아야 합니다.
eval $A=$(echo $1 | awk -F"." '{print $3}' | cut -d\- -f2-)
첫 번째 awk
문은 문자열을 다음과 같이 나눕니다.
111
222
333-ab3-On21-2
이 cut
명령은 첫 번째 "-" 뒤의 문자를 인쇄합니다.
문자열 1 111.2222.333-ab3-On21-2
원하는 결과를 반환합니다.
ab3-On21-2
문자열 2 111.2222.334
원치 않는 결과를 반환합니다.
333
문자열의 마지막 부분에는 구분 기호가 없습니다 "-"
. 이 경우 이 코드를 0 또는 ""를 반환하도록 변경하려면 어떻게 해야 합니까?
답변1
귀하의 진술에 조건이 없기 때문에 "조건"을 어디서 얻었는지 잘 모르겠습니다. 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'
%
입력이 더 복잡하다면(예: 4개의 .
구분된 필드) 스키마가 좀 더 스마트해져야 할 수도 있습니다.
sed -n 's/.*\.[^-]*-\([^\.]*\).*/\1/p'
예를 들어
% echo 111.2222.333-ab3-On21-2.999 | sed -n 's/.*\.[^-]*-\([^\.]*\).*/\1/p'
ab3-On21-2
답변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
답변3
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