스캐닝 및 그래핑

스캐닝 및 그래핑

*.ses다음 줄을 포함하는 파일()이 있습니다.

$   rea ses '../../../../abcdefgh/abcd_efgh-A20_ABC-abcdefgh-Abcdefgh_Abcdef_123er_vb001.ses'

이 명령을 사용할 때:

cat a4.ses | grep -im1 'rea ses' | awk -F'[/]' '{print $NF}'

출력은 다음과 같습니다

abcd_efgh-A20_ABC-abcdefgh-Abcdefgh_Abcdef_123er_vb001.ses'

나는 단지 다음과 같이 출력하고 싶습니다 :

abcd_efgh-A20_ABC-abcdefgh-Abcdefgh_Abcdef_123er_vb001

확장자 없이.

어떻게 해야 합니까?

답변1

정적 확장인 경우 .ses'문자열을 처음부터 끝까지 인쇄하여 후행 5자를 제거하는 awk를 하드 코딩하면 됩니다.

awk -F/ '{print substr($NF, 1, length($NF)-5)}'

확장자의 길이가 다를 수 있는 경우 인쇄하기 전에 빈 문자열로 바꾸십시오.

awk -F/ '{gsub(/\..+$/, "", $NF); print $NF}'

답변2

grepPerl 호환 정규식(PCRE) 구문을 지원하는 경우 :

$ grep -Po 'rea ses.*/\K[^.]*' file
abcd_efgh-A20_ABC-abcdefgh-Abcdefgh_Abcdef_123er_vb001

설명:

  • rea ses그런 다음 모든 항목을 포함하여 탐욕스럽게 일치시킵니다 /. 그 다음에
  • 마침표가 아닌 문자의 가장 긴 순서와 일치합니다.
  • ( \K) 왼쪽 부분을 버리고 일치하는 부분만 출력합니다 ( -o)

답변3

해당 파이프라인을 생략하고 sed대신 사용할 수 있습니다.

sed -n '/rea ses/s!^.*/\(.*\)\.[^.]*$!\1!p' a4.ses

산출

abcd_efgh-A20_ABC-abcdefgh-Abcdefgh_Abcdef_123er_vb001

해당 sed명령의 기능은 다음과 같습니다.

  1. -n일치하지 않는 한 아무것도 인쇄하지 마세요
  2. /rea ses/이 RE와 일치하는 행만 고려하십시오.
  3. s!...!...!p다음 문자열을 처음 두 개의 느낌표( !) 내에서 RE로 대체하되, 일치하는 경우에만 해당 행을 인쇄합니다.
  4. RE ^.*/\(.*\)\.[^.]*$일치

    • 마지막 슬래시까지의 모든 것/
    • 거기부터 마지막 ​​점까지의 모든 것 .(패턴으로 기억됨 \1)
    • 그 밖의 모든 것
  5. #4에 설명된 패턴의 대체는 패턴으로 이루어집니다 \1. 즉, 뒤에 점으로 표시된 확장자가 없는 파일 이름입니다.

답변4

basename다음 확장자를 제거하는 데 사용할 수 있습니다 .

cat a4.ses | grep -im1 'rea ses' | awk -F'[/]' '{print $NF}' | xargs basename -s .ses\' 

(귀하의 프로세스를 고려할 때 완전성을 위해 제출되었으며 @steeldriver의 답변이 더 좋습니다)

관련 정보