파이프라인 명령에서 조건문을 사용하는 방법은 무엇입니까? [폐쇄]

파이프라인 명령에서 조건문을 사용하는 방법은 무엇입니까? [폐쇄]

처리되는 데이터는 특정 패턴을 따릅니다. 이 경우 세 번째 열에 있는 모든 문자를 분리하고"-"그러나 열에 구분 기호가 있는 경우에만 해당됩니다. 그렇지 않으면 아무것도 반환하지 않아야 합니다.

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'

-np이는 표현식과 일치하는 문자열만 인쇄한다는 의미입니다 .

이 표현식은 마지막 항목까지 삭제한 .다음 첫 번째 항목 이전의 모든 항목을 삭제합니다 -.

그래서:

% 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

관련 정보