안녕하세요. 예를 들어 첫 번째 "_"까지 일치 항목의 한 구성 요소만 추출하고 싶은 것 같습니다.
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
또는 최신과 같이 현재 모든 상자에 없는 것과 동일한 이름입니다 .-P
freeBSD
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}