일치하는 grep 문자열에서 특정 구성요소를 반환하시겠습니까?

일치하는 grep 문자열에서 특정 구성요소를 반환하시겠습니까?

안녕하세요. 예를 들어 첫 번째 "_"까지 일치 항목의 한 구성 요소만 추출하고 싶은 것 같습니다.

echo "Ha00030_Z6_L008_I1_001.fastq.gz" | grep -P -o '^H.+?_'

그러나 위의 내용은 반환되지만 Ha00030_나는 단지 원합니다.Ha00030

일치의 특정 부분만 원한다는 것을 grep에 나타내기 위해 내가 할 수 있는 일(괄호 등)이 있습니까?

편집: ^H는 필요하지 않습니다. 따라서 첫 번째 "_"만 일치시키면 충분합니다.

답변1

이렇게 사용하세요문자 클래스 제외:

$ echo "Ha00030_Z6_L008_I1_001.fastq.gz" | grep -Po '^[^_]+'
Ha00030

PCRE또는 최신과 같이 현재 모든 상자에 없는 것과 동일한 이름입니다 .-PfreeBSD

echo "Ha00030_Z6_L008_I1_001.fastq.gz" | grep -o '^[^_]\+'

[^_]+다음을 제외하고 수량자가 _있는 모든 것을 의미합니다 .+

사용

사용매개변수 확장 대체, 바라보다:http://mywiki.wooledge.org/BashFAQ/073및 의 "매개변수 확장" man bash. 또한보십시오http://wiki.bash-hackers.org/syntax/pe

$ str=Ha00030_Z6_L008_I1_001.fastq.gz
$ echo "${str//_*/}"
Ha00030

또는

$ IFS=_ read str _ <<< "Ha00030_Z6_L008_I1_001.fastq.gz"
$ echo "$str"
Ha00030

사용 cut(모든 쉘)

POSIX라이

$ printf '%s\n' "Ha00030_Z6_L008_I1_001.fastq.gz" | cut -d'_' -f1
Ha00030

답변2

문자열을 얻는 위치에 따라 셸을 떠나지 않고도 필드를 추출할 수 있습니다.

a="Ha00030_Z6_L008_I1_001.fastq.gz"
echo "${a%%_*}"

산출

Ha00030

답변3

awk특히 논리가 더 복잡해질 가능성이 있는 경우에는 이를 고려할 수도 있습니다 .

echo "Ha00030_Z6_L008_I1_001.fastq.gz" | awk -F_ '{print $1}' 

-F_첫 번째 항목을 분할 _하여 인쇄하는 것을 의미합니다.{print $1}

관련 정보