여기에 문자열을 사용한 sed는 실패하지만 에코 출력이 sed로 파이프되면 성공합니다.

여기에 문자열을 사용한 sed는 실패하지만 에코 출력이 sed로 파이프되면 성공합니다.

버전 sed으로 업데이트 한 후 다음과 같이 명령 출력에서 ​​공백이 쉼표로 바뀌지 않습니다 .4.4sedfindhere-string

sed --version
sed (GNU sed) 4.4

ls -l /tmp/test/
total 0
-rw-r--r-- 1 root root 0 Jan  9 17:25 a
-rw-r--r-- 1 root root 0 Jan  9 17:25 b

# NOT EXPECTED
sed "s: :,:g" <<< $(find /tmp/test/ -type f)
/tmp/test/b
/tmp/test/a

sed4.2 문제 없음

sed --version
sed (GNU sed) 4.2.2

ls -l /tmp/test/
total 0
-rw-r--r-- 1 root root 0 Jan  9 17:25 a
-rw-r--r-- 1 root root 0 Jan  9 17:25 b

# as expected
sed "s: :,:g" <<< $(find /tmp/test/ -type f)
/tmp/test/a,/tmp/test/b

해결 방법으로 결과를 변수에 저장하고 다음을 사용하는 것이 도움이 됩니다 echo.

a=$(find /tmp/test/ -type f)
echo $a | sed "s: :,:g" 
/tmp/test/b,/tmp/test/a

sed4.4를 사용하여 동일한 출력을 얻으려면 어떻게 해야 합니까 here-string?

고쳐 쓰다

bash 버전도 두 시스템 간에 변경되었습니다.

bash --version
GNU bash, version 4.4.20

구 버전

bash --version
GNU bash, version 4.3.48

답변1

이것은변화bash버전 4.3과 4.4 사이

문서에서 계속해서 말하듯이 Bash는 더 이상 여기에서 문자열 확장을 분할하지 않습니다.

이전 코드의 버그에 의존했기 때문에 올바른 동작은 새 버전입니다.

이렇게 하면 쉼표로 구분된 파일 목록이 제공됩니다.

find -type f | tr '\n' , | sed 's/,$/\n/'

그러나 파일 이름 자체에 개행 문자와 쉼표가 포함될 수 있으므로 취약한 코드가 깨지기 쉽습니다. 새로운 질문에서 프로세스를 공유하려는 경우 누군가가 파일 이름을 안정적이고 안전하게 처리하는 더 나은 방법을 추천할 수 있을 것이라고 확신합니다.

관련 정보