스캔 및 크롤링

스캔 및 크롤링

*.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자까지 인쇄하여 후행 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의 답변은 프로세스를 고려하는 것이 더 좋습니다)

관련 정보