파이프라인 bash 문자열 조작

파이프라인 bash 문자열 조작

다른 파이프된 bash 문자열 조작 질문에 대해 읽었지만 이는 응용 프로그램에 따라 다른 것 같습니다.

본질적으로 다음을 더 간단하게 만드는 방법이 있습니까?

바꾸다

$ string='hello world'; string2="${string// /_}"; echo "${string2^^}"
HELLO_WORLD

그것은 마치

$ echo 'hello world' | $"{-// /_}" | "${ -^^}"
HELLO_WORLD

편집 가능하다면 속도를 유지하기 위해 bash 작업을 유지하는 데 관심이 있습니다(스크립트 속도를 크게 저하시키는 경향이 있는 sed/awk 대신).

편집 2: @jimmij

나는 두 번째 예를 좋아하는데, 이를 통해 함수를 만들게 되었습니다.

bash_m() { { read x; echo "${x// /_}"; } | { read x; echo "${x^^}"; }; }
echo hello world | bash_m
HELLO_WORLD

답변1

지미가 말한 것. 그의 마지막 예는 파이프 표현식에서 시도하는 것과 가장 가깝습니다.

다음은 테마의 변형입니다.

echo 'hello world'|echo $(read s;s=${s^^};echo ${s// /_})

tr꽤 빠르기 때문에 이것을 사용하는 경향이 있습니다 .

echo 'hello world'|tr ' [:lower:]' '_[:upper:]'

bash가 중첩된 매개변수 확장을 허용하지 않는다는 것은 유감스러운 일입니다. 이러한 중첩된 표현식을 사용하면 쉽게 읽을 수 없는 코드가 발생할 수 있습니다. 너가 아니라면진짜가능한 한 빨리 실행해야 한다면 똑똑해 보이지만 디버깅이 필요한 PITA 코드를 작성하는 것보다 읽고 이해하고 유지 관리하기 쉬운 코드를 작성하는 것이 좋습니다. 만약 당신이 정말로하다가능한 한 빨리 작업을 완료해야 하며, 컴파일된 코드를 사용해야 합니다.아니요스크립트.

답변2

이 방법으로 매개변수 확장을 전달할 수 없습니다. 양식에서 xusing $기호를 참조하는 경우 "${x}"표준 입력이 아닌 실제 변수 이름이어야 하며, 적어도 표준 입력에서는 다음을 사용하여 중첩된 매개변수 대체를 수행 bash할 수 있습니다 .zsh

$ x=''hello world'
$ echo ${${x// /_}:u}
HELLO_WORLD

(참고: :u와 동일)zsh^^bash

Bash에서는 중첩이 불가능합니다. 귀하가 작성한 내용이 최고라고 생각합니다. 그러나 이상한 이유로 파이프를 방정식에 통합해야 하는 경우 다음을 시도해 볼 수 있습니다.

$ echo 'hello world' | { read x; echo "${x// /_}"; } | { read y; echo "${y^^}"; }
HELLO_WORLD

관련 정보