awk 숫자 필드만 제거

awk 숫자 필드만 제거

이 명령을 사용할 때:

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

또한 작동합니다.

관련 정보