내 내용은 다음과 같습니다/tmp/myfileslist
test1/a/sample1.xls
test2/demo.sh
슬래시와 슬래시도 제거되기 전에 .extensions 및 콘텐츠를 제거하고 싶습니다. 나는 출력을 원한다.
sample1
demo
답변1
( awk
그리고 중복이 없다고 가정)가리키다기록에 접미사를 붙이 /path/to/some.example.txt
세요. 예를 들어 "예"부분"만)
awk -F'[/.]' '{ print $(NF-1) }' infile
해당 기록이 있는 경우 아래 기록을 대신 사용하시기 바랍니다.
awk -F'/' '{ sub(/.[^.]*$/, ""); print $NF }' infile
답변2
귀하의 cut
방법에는 필드 수가 행마다 변경되는 문제가 있습니다.
또한 "파이프를 사용하지 말고 cat
" 파일 이름을 텍스트 처리 명령의 속성으로 사용하십시오.
.*/
두 단계에 걸쳐 슬래시( ) 앞의 모든 항목을 제거한 다음 \..*
점( )으로 시작하는 모든 항목을 제거합니다 .
sed 's_.*/__;s_\..*__' /tmp/myfilelist
(이것은 모든 확장명을 제거하고 .만 원한다고 가정합니다 foo
. foo.tar.gz
)
답변3
자르다
cut
각 행을 먼저 뒤집으면 다음과 같이 마지막 요소를 가져올 수 있습니다.
<filelist.txt rev | cut -d/ -f1 | rev
이제 다음과 같이 파일 확장자를 제거할 수 있습니다.
<filelist.txt rev | cut -d/ -f1 | rev | cut -d. -f1
세게 때리다
또한 다음을 사용할 수 있습니다 cut
.sed
Bash 매개변수 확장다음과 같이 경로 파일 확장자를 제거합니다.
while read f; do
f="${f##*/}"
f="${f%.*}"
printf '%s\n' "$f"
done < filelist.txt
팁: ${f%%.*}
모든 확장 프로그램을 제거하는 데 사용됩니다.
답변4
사용행복하다(이전 Perl_6)
~$ raku -ne 'put .IO.extension("").basename;' file
#OR (below handles up to 8-part extensions):
~$ raku -ne 'put .IO.extension("", :parts(^9)).basename;' file
입력 예:
/test1/a/sample1.xls
/test2/demo.sh
/some/file.txt
/whatever/prog.c
/something/abc.tar.bz
/something/abc.123.456.789.tar.bz
/something/abc.c
/something/abc.h
/path/to/file.10.5.2.tar.gz
/path/to/file.10.5.2.tar.gz.whatever
/path/to/file.10.5.2.tar.gz.whatever.7.pdf
/noextension
예제 출력:
sample1
demo
file
prog
abc
abc
abc
abc
file
file
file
noextension
즉, 자동 인쇄가 아닌 한 줄씩 플래그를 사용하여 파일을 한 줄씩 읽습니다 -ne
. 코드는 각 줄에서 실행됩니다. 먼저 경로는 IO
식별/수정될 수 있는 객체로 해석됩니다 . 매개변수 extension
내에서 extension
식별된 부품은 ""
교체(즉, 삭제)되지 않습니다. 매개변수("부사"라고도 함)를 추가하면 :parts
여러 부분으로 구성된 파일 확장자를 인식할 수 있습니다. 마지막으로 basename
이를 분리하려면 경로의 모든 부분(슬래시 이상)을 제거합니다.
Raku는 운영 체제별 설정을 통해 파일 경로를 이해하므로 위의 코드는작동해야 한다Windows 경로에서 올바른 요소를 추출하기 위해 Windows에서 수정되지 않았습니다(Raku는 Windows 운영 체제에서 백슬래시를 경로 구분 기호로 이해합니다).
https://docs.raku.org/type/IO/Path
https://docs.raku.org/routine/basename
https://docs.raku.org/routine/extension
https://raku.org