이 명령을 사용할 때:
ls /var/log/packages/*SBo|cut -d / -f 5
다음을 반환합니다.
webcore-fonts-3.0-noarch-3_SBo
winetricks-20120923-noarch-1_SBo
wireshark-1.12.1-x86_64-1_SBo
wxGTK-2.8.12-x86_64-3_SBo
숫자 필드부터 시작하여 모든 항목을 제거하고 싶습니다(나머지 행은 생략해야 함). 그래서 나는 다음과 같이 보이기를 원합니다.
webcore-fonts
winetricks
wireshark
wxGTK
어떻게 해야 하나요? 완벽하다고 생각 awk
하지만 나머지 행(숫자만 삭제)을 삭제하는 방법을 모르겠습니다.
답변1
당신은 시도 할 수 있습니다:
ls /var/log/packages/*SBo| sed 's/-[0-9].*//'
답변2
이는 다음을 통해 쉽게 수행할 수 있습니다 sed
.
$ ls /var/log/packages/*SBo | sed -r 's|.*/||; s/-[[:digit:]][[:digit:].]*-.*//'
webcore-fonts
winetricks
wireshark
wxGTK
설명하다:
-r
이를 통해 확장된 정규 표현식이 활성화되어 필요한 이스케이프 횟수가 줄어듭니다.
s|.*/||
파일 이름 앞의 디렉터리가 삭제됩니다.
s/-[[:digit:]][[:digit:].]*-.*//
이것은 대시로 둘러싸인 숫자처럼 보이며 대시와 그 뒤의 모든 내용이 제거됩니다.
[:digit:]
대신 정규식을 사용하면[0-9]
모든 로캘 및 확장 문자 집합에서 작동합니다.
Mac OSX에서는 다음을 시도해 보세요.
ls /var/log/packages/*SBo | sed -E -e 's|.*/||' -e 's/-[[:digit:]][[:digit:].]*-.*//'
답변3
파일 이름에 공백과 같은 이상한 문자가 포함될 수 있거나 명령을 구문 분석하는 아이디어가 마음에 들지 않으면 ls
다음을 사용할 수 있습니다 find
.
find /var/log/packages -maxdepth 1 -name '*SBo' -exec sh -c 'sed s,.*/,,\;s/-[[:digit:]].*//<<<"$0"' {} \;
답변4
Bourne과 같은 쉘에서 이 작업을 수행할 수 있습니다.
for Package in /var/log/packages/*SBo;do
Package="$(basename $Package)"
echo "${Package%%-[0-9]*}"
done
이는 다음을 활용합니다.매개변수 확장-
패키지 이름에서 첫 번째 항목 이후의 모든 항목, 숫자, 기타 항목을 모두 제거합니다 .
해당 로케일에 알 수 없는 [0-9]
번호 가 있는 경우 [[:digit:]]
사용하는 팁John1024의 답변또한 여기서 일합니다. 그건,
for Package in /var/log/packages/*SBo;do
Package="$(basename $Package)"
echo "${Package%%-[[:digit:]]*}"
done
또한 작동합니다.