유닉스에서 마지막 슬래시 문자를 제거하는 방법은 무엇입니까?

유닉스에서 마지막 슬래시 문자를 제거하는 방법은 무엇입니까?

이와 같은 vlsi 코드가 있습니다.

instance1/instance2/instance3/and_gate_inst/and_gate/a_pin
instance1/instance2/or_gate/b_pin

이제 다음과 같은 정보를 얻을 수 있도록 도와주실 수 있나요?

instance1/instance2/instance3/and_gate_inst/and_gate 
instance1/instance2/or_gate

혼란을 드려 죄송합니다. 위의 질문이 정답입니다.

답변1

이 줄에 경로가 저장된 파일이 포함된 디렉터리의 경로를 얻으려는 것 같습니다.

기본 사례에 대한 답변은 이미 제공되었지만 일반적인 사례에서 고려할 만한 몇 가지 사항을 언급하겠습니다.

  • 대부분의 Unices에서 파일 경로는 0을 제외한 모든 바이트 시퀀스로 구성될 수 있습니다. 여기에는 개행을 나타내는 데 사용되는 바이트가 포함됩니다. 여기에는 유효한 문자를 형성하지 않는 바이트 시퀀스가 ​​포함될 수 있으며, 이는 LINE_MAX텍스트 줄이 가질 수 있는 최대 바이트 수를 정의하는 표준 상수(그러나 그 값은 각 구현의 재량에 따라 결정됨)보다 길 수 있습니다. 원하는 경우) 및 텍스트 유틸리티가 제대로 작동하도록 보장됩니다.

    따라서 이 입력 형식은 파일 경로 목록(예: 줄바꿈이 포함된 파일 경로 목록)을 나타낼 수 없습니다. 줄바꿈이 없고 LINE_MAX바이트 미만인 파일 경로 목록의 경우에도 C 로케일에서 텍스트 유틸리티를 실행해야 합니다. 임의의 바이트 값을 처리할 수 있습니다.

  • /경로 구성 요소 구분 기호이지만

    • /alone은 특별하며 루트 디렉터리 파일을 나타냅니다. 아니요목차파일을 포함하지만 일반적으로 관례적으로 상위 디렉터리는 그 자체라고 말합니다. 그럼에도 불구하고 입력에 나타날 가능성이 있는 경우 특별히 처리해야 합니다.
    • /유사하게 동작하는 여러 시퀀스 foo//bar는 와 동일합니다 foo/bar.
    • 처음에 정확히 2개가 있는 시퀀스는 제외됩니다 //. 이는 ///foo와 동일 /foo하지만 //foo동일하다고 보장되지는 않습니다 /foo(일부 시스템에서는 그렇지 않음). 보다 일반적으로, 우리는 .로 시작하는 파일의 일반적인 상황에 대해 많이 알 수 없습니다 //. 예를 들어, /분리된 각 구성 요소는목차, 따라서 이 경우 무엇을 해야할지 결정하기가 어렵습니다.
  • foo상대 경로이기도 합니다. 상위 디렉토리 .가 아닙니다.빈 문자열.

  • ...실제 파일보다 디렉토리 탐색 도구에 가깝습니다 . 그러나 그들은인용하다실제 파일에 그렇다면 디렉토리 이름이나 상위 디렉토리에 대해 무엇을 보고해야 합니까( ..그리고 ../..각각? 아니면 .다른 /-less 상대 경로를 좋아합니까?).

  • foo/bar/또는 foo/bar//적어도 디렉터리 자체 foo/bar인 경우 foo/bar상위 디렉터리는 foo.

하나가 없어길들인입력은 다음과 같습니다.

//foo/bar
///foo//bar//
foo
foo//
.
../
foo<0x80>bar/baz<0x81>
--foo
/
//
///

문제를 해결하는 한 가지 방법은 명령에 복종 dirname하고 명확한 결정이 없을 때 결정을 받아들이는 것입니다.

이식성의 어려운 부분은 행 기반 입력에서 매개변수를 가져오는 것입니다 dirname.

GNU 시스템에서는 다음을 통해 이를 수행할 수 있습니다.

xargs -rd '\n' -a your-file dirname --

GNU dirname8.30은 다음을 제공합니다:

//foo
///foo
.
.
.
.
foo<0x80>bar
.
/
/
/

그러나 다음과 같은 이유로 대부분의 다른 시스템에서는 작동하지 않습니다.

  • -d및 / -r또는 -a비표준 GNU xargs확장
  • 일부 xargs구현은 텍스트가 아닌 입력으로 인해 중단됩니다.
  • dirname여러 주장을 받아들일 필요가 없습니다(그렇게 하는 사람은 거의 없습니다).

실행 중인 명령의 최대 크기 매개변수보다 긴 파일 경로의 경우 여전히 실패할 수 있습니다.

답변2

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

어디

  • /문자 그대로의 의미와 일치/
  • [^/]*0개 이상의 비 /문자와 일치합니다.
  • $줄 끝 일치

답변3

원하는 출력을 얻으려면 awk다음 명령을 사용할 수 있습니다.

awk -F'/' '{print $1"/"$2}' <file_name>

-F'/'옵션은 "/"를 열 구분 기호로 정의합니다. print $1"/"$2는 첫 번째 열을 인쇄하고 "/"를 연결한 다음 두 번째 열을 인쇄합니다.

절단을 통해 원하는 출력을 얻을 수도 있습니다.

cut -d'/' -f1,2 <file_name>

답변4

다들 감사 해요,

마침내 효과가 있었습니다.

awk -F "/" '{$NF=""; print $0}' instance1/instance2/instance3/and_gate_inst/and_gate/a_pin | sed 's/ /\//g' | sed 's/\/$//'
awk -F "/" '{$NF=""; print $0}' instance1/instance2/or_gate/b_pin | sed 's/ /\//g' | sed 's/\/$//'

관련 정보