마지막 슬래시 앞의 줄 부분을 가져옵니다.

마지막 슬래시 앞의 줄 부분을 가져옵니다.

앨범 폴더에 "folder.jpg"인 MPD 앨범 커버를 표시하기 위한 conky 스크립트를 작성하려고 합니다. 내 현재 계획은 mpc -f %file%파일 이름과 경로를 인쇄한 다음 실제 파일 이름(즉, 마지막 / 이후의 모든 항목)을 잘라내어 이를 conky의 이미지 개체에 대한 경로로 사용하는 을 사용하는 것입니다.

grep/cut을 사용하는 데 문제가 있습니다. 특히 일부 노래는 두 개의 폴더에 중첩되어 있고 다른 노래는 하나의 폴더에 중첩되어 있기 때문입니다. ( grep -m 1 . |cut -f1 -d /단일 폴더 앨범에 적용 가능)

어떻게 해야 하나요? 내가 놓친 더 쉬운 방법이 있습니까?

답변1

sed다음을 사용하여 나머지를 삭제할 수 있습니다 .모든 것은 마지막 슬래시로 시작됩니다:

mpc -f %file% | head -1 | sed 's:/[^/]*$::'

이 패턴은 /[^/]*$줄 끝까지 슬래시를 제외한 모든 문자가 뒤에 오는 슬래시와 일치합니다. 빈 문자열로 대체됩니다. 원하는 행 다음에 나오는 일부 상태 출력을
무시하십시오 head -1. 그러나 처음에 이를 인쇄하지 않는 방법은 아래를 참조하십시오.

sed에 익숙하지 않다면 이 명령이 :사용되는 이유 때문에 이상하게 보일 수 있습니다. 예를 들어 이전에 sed구분 기호가 있는 명령을 본 적이 있을 것입니다 . 표현식에 자체가 포함되어 있기 때문에 가독성을 위해 구분 기호를 사용하는 것을 선호합니다 . 또는 표현식에서 -를 이스케이프 처리할 수도 있지만 그렇게 해도 가독성이 높아지지는 않습니다./'s/foo/bar/'://'s/\/[^\/]*$//'


이를 사용하는 방법에 따라 mpc두 개의 추가 상태 줄이 제공됩니다. 자동 옵션은 -q모든 출력을 끕니다. 원하는 줄을 얻으려면 현재 재생 중인 파일을 명시적으로 인쇄하는 것과 이를 결합해야 -q하지만 그게 전부입니다.

mpc -q -f %file% current | sed 's:/[^/]*$::'

삭제하는 대신모든 것은 마지막 슬래시로 시작됩니다, 명시적으로 인쇄할 수 있습니다.마지막 슬래시 이전의 모든 것:

mpc -q -f %file% current | sed 's:^\(.*\)/.*$:\1:'

뒤에 a 및 기타 문자가 오는 모든 문자 와 일치합니다 . 마지막 문자가 일치 /하도록 최대한 많이 일치합니다 ./

답변2

이 규칙을 단일 문자열에 적용하려면 sed대신 다음을 사용할 수 있습니다(다른 답변 참조) dirname.

$ dirname "1 2/3 4/5 6/file"
1 2/3 4/5 6

답변3

Grep은 작업을 위한 마지막 도구가 아닙니다. grep -m 1 .비어 있지 않은 첫 번째 줄을 인쇄하지만 작동하지 않습니다. grep 및 기타 도구를 포함하는 복잡한 솔루션을 구축할 수 있지만 가장 쉬운 방법은 다음을 사용하는 것입니다.sed. 한 가지 방법은 슬래시가 아닌 마지막 실행 문자와 이전 슬래시를 빈 문자열로 바꾸는 것입니다.

mpc -f %file% | sed 's:/[^/]*$::'

또는 마지막 슬래시까지 모든 것을 유지하고 다음을 삭제합니다.

mpc -f %file% | sed 's:^\(.*\)\(/.*\)$:\1:'

두 방법 모두 /입력 내용이 포함되어 있지 않은 경우, 즉 디렉터리 표시 없이 파일 이름이 전달된 경우 입력을 변경하지 않고 그대로 둡니다. 이것이 문제라면 sed에서 해결할 수 있지만dirname주문하다:

dirname -- "$(mpc -f %file%)"

쉘 스크립트에서는 다음을 사용할 수도 있습니다.매개변수 확장구성하지만 결과만 인쇄하려는 경우에는 더 복잡합니다.

full_path="$(mpc -f %file%)"
case "$full_path" in
  */*) directory_part="${full_path%/*}"
  *) directory_part="."
printf '%s\n' "$directory_part"

관련 정보