sed의 구문 분석된 출력을 전달하여 (이 방향으로)

sed의 구문 분석된 출력을 전달하여 (이 방향으로)

글쎄요, 제 생각에는 이 플랫폼에서 파이프 연결 방법에 대한 수십 가지 질문을 찾을 수 있을 것 같습니다.find 산출하지만 sed지금까지 반대 방향에서는 아무것도 찾지 못했습니다. 내가 하고 싶은 것은 내 것을 수정하는 것이다.입력하다, 그리고그 다음에에 전달하세요 find.

지루한 별표 와일드카드를 입력하는 것을 피함으로써 내 삶을 더 쉽게 만들기 위해 다음과 같은 작업을 수행하고 싶다고 가정해 보겠습니다. (이 문자열 연산자 뒤에 오는 표현식이 결국 스크립트의 뒷부분에서 <<<매개 변수로 대체될 계획이라는 것이 분명하기를 바랍니다. 아래 줄은 데모용으로만 제공됩니다.)$1

$ sed 's/ /\*/g' <<< ' foo bar baz ' | find . -type f -iname - 

-사실 이 줄의 끝은~해야 한다출력을 sed입력으로 사용하십시오 find. 그러나 find해당 섹션을 다음으로 확장하십시오.

... find -D tree . -type f -iname - ... 

이 매개변수를 표시합니다.아니요파이프를 사용하여 전처리된 입력을 전달할 수 없는 것일 수도 find있습니다 .find

답변1

find인수는 표준 입력이 아닌 명령줄에서 가져옵니다. 따라서 다음과 같습니다.

find . -iname "$(sed 's/ /\*/g' <<< ' foo bar baz ')"

그것은 다음과 같습니다:

find . -iname "foo*bar*baz*"

(쉘이 와일드카드 foo*bar*baz*를 확장하는 것을 방지하려면 따옴표가 필요합니다)

이것은 당신이 원하는 것일 수도 있고 아닐 수도 있습니다. 예를 들어 foo, bar 또는 baz로 시작하는 파일을 원하지만 "foo*bar*baz*" 패턴과 일치하는 파일은 원하지 않는 경우 정규식을 구성하고 대신 or -regex를 사용해야 합니다 . 또는 다음과 같이 더 복잡한 찾기 명령을 작성하십시오.-iregex-iname-iname 'foo*' -o -iname 'bar*' -o -iname 'baz*'

또는:

PATTERN='foo bar baz'
PATTERN=$(echo "$PATTERN" | sed -e 's/ /*/g')
# and/or do whatever else you need to do to transform $PATTERN to be what
# you need it to be...
find . -iname "$PATTERN"

이것은 bash 스크립트의 코드 줄입니다. 명령줄에서와 마찬가지로 스크립트에서도 정확히 동일한 방식으로 작동합니다.

$ cat ./test.sh
#! /bin/bash 
find . -iname "$(sed 's/ /\*/g' <<< ' foo bar baz ')"

$ ls -l
total 4
-rw-r--r-- 1 cas cas  0 Sep 26 16:53 doesntmatch
lrwxrwxrwx 1 cas cas 16 Sep 26 16:59 symlink -> xfoo-ybar-zbaz01
-rwxr-xr-x 1 cas cas 69 Sep 26 16:50 test.sh
-rw-r--r-- 1 cas cas  0 Sep 26 16:50 xfoo-ybar-zbaz01
-rw-r--r-- 1 cas cas  0 Sep 26 16:50 xfoo-ybar-zbaz02
-rw-r--r-- 1 cas cas  0 Sep 26 16:50 xfoo-ybar-zbaz03

$ ./test.sh 
./xfoo-ybar-zbaz01
./xfoo-ybar-zbaz03
./xfoo-ybar-zbaz02

$ find . -iname "$(sed 's/ /\*/g' <<< ' foo bar baz ')"
./xfoo-ybar-zbaz01
./xfoo-ybar-zbaz03
./xfoo-ybar-zbaz02

$ find . -iname "*foo*bar*baz*"
./xfoo-ybar-zbaz01
./xfoo-ybar-zbaz03
./xfoo-ybar-zbaz02

답변2

for 루프를 사용하지 않는 이유는 무엇입니까?

for n in $(sed 's/ /\*/g' <<< ' foo bar baz '); do find . -iname $n; done

관련 정보