*.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
grep
Perl 호환 정규식(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
의 기능은 다음과 같이 설명할 수 있습니다.
-n
일치하는 항목이 없으면 아무것도 인쇄하지 않음/rea ses/
이 RE와 일치하는 행만 고려s!...!...!p
처음 두 느낌표(!
)의 RE를 다음 문자열로 바꾸십시오. 단, 일치하는 경우에만 해당 행을 인쇄하십시오.RE
^.*/\(.*\)\.[^.]*$
매치- 마지막 슬래시까지의 모든 것
/
- 거기부터 마지막 지점까지의 모든 것
.
(패턴으로 기억됨\1
) - 그 밖의 모든 것
- 마지막 슬래시까지의 모든 것
#4에 설명된 패턴의 교체는 패턴으로 수행됩니다
\1
. 즉, 뒤에 점 확장자가 없는 파일 이름입니다.
답변4
basename
다음을 사용하여 후행 확장자를 제거 할 수 있습니다 .
cat a4.ses | grep -im1 'rea ses' | awk -F'[/]' '{print $NF}' | xargs basename -s .ses\'
(완전성을 위해 제출되었으며 @steeldriver의 답변은 프로세스를 고려하는 것이 더 좋습니다)