sed는 일치하는 패턴을 검색하고 표시하며 나머지는 삭제합니다.

sed는 일치하는 패턴을 검색하고 표시하며 나머지는 삭제합니다.

패키지가 포함된 목록을 정리하려고 합니다. 패키지 개정판을 제거하고 패키지 이름만 유지하고 싶습니다.

모든 패키지에는 package-name-majorver-minorver 등의 명명 규칙이 있습니다: openssl-1.0.1e-57.0.5.el6 . -1.0.1e-57.0.5.el6이 아닌 openssl만 원합니다.

나는 지금까지 이것을 가지고 있지만 sed 's/^.*-//'분명히 작동하지 않습니다.

답변1

패키지 이름에 항상 두 개의 버전 번호 부분이 하이픈으로 구분되어 추가되고 버전 부분에 하이픈이 포함되지 않는 경우 이 명령을 사용할 수 있습니다.

sed 's/-[^-]*-[^-]*$//'

$이렇게 하면 줄 끝에 있는 두 개의 하이픈( )이 제거됩니다 . 각 하이픈 뒤에는 하이픈이 아닌 문자가 0개 이상 나옵니다. 또한 foo-bar-baz--예를 들어 다음 foo-bar-baz과 같이 변경됩니다 .

답변2

패키지 이름에 다음이 포함되지 않은 경우 작동합니다 -.

sed -r 's/([^-]+).*/\1/' 

답변3

알겠습니다. 이것이 최선의 해결책은 아니지만 이것을 찾았습니다.https://stackoverflow.com/a/51153277/5227747, 그래서 해결책은

cat file | sed 's/ // ; s/-/\t/' | rev | cut -f 3- | rev | sed 's/\t/-/'

마지막 두 개의 "-"로 구분된 열을 쉽게 제거합니다. 더 나은 방법을 아는 사람이 있다면 알고 싶습니다.

관련 정보