이와 같은 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 dirname
8.30은 다음을 제공합니다:
//foo
///foo
.
.
.
.
foo<0x80>bar
.
/
/
/
그러나 다음과 같은 이유로 대부분의 다른 시스템에서는 작동하지 않습니다.
-d
및 /-r
또는-a
비표준 GNUxargs
확장- 일부
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/\/$//'