여러 텍스트에서 경로 목록을 필터링하는 방법은 무엇입니까?

여러 텍스트에서 경로 목록을 필터링하는 방법은 무엇입니까?

여러 경로가 포함된 텍스트 파일(.txt)이 있는데 이를 필터링하고 경로 목록만 남기고 싶습니다.

파일은 다음과 같습니다:

Loremipsumdolorsitametconsecteturadip"/one/path/I_want_to_keep"iscingelitseddoeiusmodtemporincididuntutlaboreetdoloremagnaaliqua
Utenimadminimveniamquisnostrudexercitationul"/another/path/I_want_to_keep"lamcolaborisnisiutaliquipexeacommodoconsequat
Duisauteiruredolorinreprehenderitinvoluptatevelitess"/another/path/I_want_to_keep"ecillumdoloreeufugiatnullapariatur
Excepteursintoccaecatcupidatatnonproident"/another/path/I_want_to_keep"suntinculpaquiofficiadeseruntmollitanimidestlaborum

예제에 표시된 경로에는 따옴표("")로 둘러싸인 세 개의 슬래시(/)가 있고, 경로의 마지막 부분은 밑줄(_)로 구분된 여러 단어이며, 주변 텍스트에는 특정 패턴이 없습니다.

저는 zsh 5.8(x86_64-apple-darwin21.0)을 사용하고 있습니다.

답변1

나는 이것을 제안한다:

% grep -o '"/[^"]*"' file
"/one/path/I_want_to_keep"
"/another/path/I_want_to_keep"
"/another/path/I_want_to_keep"
"/another/path/I_want_to_keep"

답변2

그리고 perl:

perl -lne 'print for grep m{^/.*/.*/}, /"(.*?)"/g' < your-file

인용된 문자열의 내용을 추출하고(여러 줄에 걸쳐 있지 않다고 가정) /최소한 두 개의 추가 s` /로 시작하고 포함하는 문자열을 검색합니다.

이렇게 입력하면

"foo"/x/y/"bar"/"/a/b/c"/"/X/Y"

foo, , bar및 문자열 중 1/3만이 기준을 충족하므로 /a/b/c출력만 얻습니다. 실제로 따옴표 밖에 있기 때문에 보고되지 않는 방법도 확인하세요./X/Ygrep()/a/b/c"/x/y/"/x/y/

을 언급하셨으므로 연산자로 비슷한 작업을 수행 zsh하려면 zsh다음을 수행합니다.

set -o extendedglob
string='"foo"/x/y/"bar"/"/a/b/c"/"/X/Y"'

quoted_strings=()
: ${(S)string//(#b)\"(*)\"/${quoted_strings[$#quoted_strings+1]::=$match[1]}}

print -rC1 ${(M)quoted_strings:#/*/*/*}

어디

  • 매개변수 확장 플래그는 탐욕스럽지 않은 일치 항목 일치를 S켭니다 .${param//pattern/replacement}
  • (#b)(이를 위해서는 extendedglob) 견적 확인 활성화 ( b일치하는 콘텐츠 (*)에 사용 가능 $match[1])
  • ${var::=value}확장 시 value(/의 Bourne 쉘 $var변형) 에 무조건 할당됩니다. 여기서는 일치 항목을 배열에 추가하는 데 사용합니다.${var-value}${var:-value}$quoted_strings
  • print -rC1olumn에 해당 매개변수 raw를 인쇄합니다.1 C
  • ${(M)array:#pattern}catch the 요소 로 확장됩니다 array(접두사/접미사뿐만 아니라 전체 요소를 전체적으로 제거하는 ksh의 / 변형이며 매개변수 확장 플래그가 이를 복원합니다(제거하는 대신 일치 항목을 유지함).Mpattern${var:#pattern}${var#pattern}${var%pattern}M

관련 정보