
*.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
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의 답변이 더 좋습니다)