여러 경로가 포함된 텍스트 파일(.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/Y
grep()
/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 -rC1
olumn에 해당 매개변수r
aw를 인쇄합니다.1
C
${(M)array:#pattern}
catch the 요소 로 확장됩니다array
(접두사/접미사뿐만 아니라 전체 요소를 전체적으로 제거하는 ksh의 / 변형이며 매개변수 확장 플래그가 이를 복원합니다(제거하는 대신 일치 항목을 유지함).M
pattern
${var:#pattern}
${var#pattern}
${var%pattern}
M