![공백 없이 여러 단어가 포함된 문자열의 첫 번째 단어를 인쇄하는 방법은 무엇입니까?](https://linux55.com/image/218026/%EA%B3%B5%EB%B0%B1%20%EC%97%86%EC%9D%B4%20%EC%97%AC%EB%9F%AC%20%EB%8B%A8%EC%96%B4%EA%B0%80%20%ED%8F%AC%ED%95%A8%EB%90%9C%20%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%98%20%EC%B2%AB%20%EB%B2%88%EC%A7%B8%20%EB%8B%A8%EC%96%B4%EB%A5%BC%20%EC%9D%B8%EC%87%84%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
다음과 같은 폴더에 appimage 파일 이름을 인쇄하는 쉘 스크립트가 있습니다.
#! /bin/bash
Dir="$HOME/Applications/"
Dir2="$HOME/Downloads/"
cd -P "$Dir"
for f in *.AppImage; do
z=$(echo $f | head -n1 | awk '{print $1;}')
echo $z
done
이제 출력은 다음과 같습니다.
Altus-4.8.5-x86_64.AppImage
GitHubDesktop-linux-3.2.0-linux1.AppImage
webamp-desktop-0.3.0-x86_64.AppImage
YTDownloader.AppImage
출력이 다음과 같기를 원합니다.
Altus
GitHubDesktop-linux
webamp-desktop
YTDownloader
어떻게 해야 하나요?
답변1
접미사를 제거 하려면 %
:
for f in *.AppImage; do
f=${f%.AppImage}
echo "${f%%-[0-9]*}"
done
답변2
다음을 사용하십시오 sed
(파일 이름에 개행 문자가 없다고 가정).
printf '%s\n' "$fileName" |
sed -E 's/(-[0-9].*)?\.AppImage//'
답변3
GNU 사용 grep
:
<INTPUT> | grep -oP '^\D+(?=-\d|\.)'
사용 Perl
:
<INPUT> | perl -nE 'say $& if /^\D+(?=-\d|\.)/'
산출
Altus
GitHubDesktop-linux
webamp-desktop
YTDownloader
정규식 일치는 다음과 같습니다.
정규식 | 설명하다 |
---|---|
^\D+ |
정규식 시작 부분에서 숫자가 아닌 문자 1개 이상과 일치합니다. |
(?=-\d|\.) |
선택 항목에 포함하지 않고 하이픈, 숫자 또는 마침표를 일치시키려고 미리보기를 수행합니다. |
답변4
파일 이름에 줄 바꿈이 포함되어 있지 않다고 가정하고 awk를 사용하십시오.
printf '%s\n' *.AppImage | awk -F'[.]|-[0-9]' '{print $1}'
개행 문자를 포함할 수 있는 경우 GNU awk 또는 RS에 NUL을 사용할 수 있는 다른 버전을 사용하세요.
printf '%s\0' *.AppImage | awk F'[.]|-[0-9]' 'BEGIN{RS=ORS="\0"} {print $1}'