zsh에서 문자열 수정자를 사용하여 입력 변수를 수정하는 방법은 무엇입니까?

zsh에서 문자열 수정자를 사용하여 입력 변수를 수정하는 방법은 무엇입니까?

bold나는 개념 증명과 나 자신에 대한 도전으로 기능을 개발해 왔습니다 . 텍스트(예: )를 입력 foo하고 굵은 글씨(foo).

문맥:

저는 테마 파일의 변수를 사용하고 echo있으며 이를 기본으로 사용하고 있습니다. PROMPT나는 어떤 프레임워크도 사용하지 않습니다.

%B%n%b테마는 굵은 사용자 이름()과 같은 코드를 사용 하지만 이를 사용자 입력( )으로 바꾸는 %n방법을 모르겠습니다 . 도움이 되었나요?%n$1

편집: 시도해 볼 코드

echo '%B'"$1"'%b'

- 따옴표를 사용하거나 사용하지 않고 서브쉘( {}) 을 사용하여 다양한 위치에서 시도했습니다.

답변1

%B그리고 %b예이다프롬프트 순서, 일반적으로 프롬프트 형식 지정에만 사용됩니다. 일반적인 스크립팅의 경우 다음 tput명령을 사용하여 원하는 것을 얻을 수 있습니다.

echo "$(tput bold)$1$(tput sgr0)"

또는 출력할 수 있습니다.ECMA-48("ANSI") 직접 이스케이프 코드입니다. 하지만 이 방법은 터미널 간 이식성이 떨어지기 때문에 권장하지 않습니다. (요즘 21세기에는 ECMA-48과 기본 ECMA-48 SGR 기능(굵게 등)을 구현하지 않은 터미널을 찾기가 상당히 어렵습니다. 터미널은 서로 정확히 동일한 제어 순서를 이해한다고 보장할 수 없습니다. 또한 굵은 글꼴이 글꼴 두께 변경이 아닌 색상 변경인 일부 터미널 에뮬레이터가 여전히 있다는 점도 알아야 합니다.

echo $'\e[1m'"$1"$'\e[22m'

사용에 주의하세요코헨 명언제어 시퀀스의 경우. 일반적으로 이 echo명령은 그럴 수도 있고 아닐 수도 있습니다.그 자체시퀀스 는 Korn 스타일 인용문이 아닌 경우 해석되며 \e이러한 이스케이프 시퀀스는 다른 쉘 또는 동일한 쉘의 다른 버전에서 다르게 작동합니다. 반대로 모든 쉘이 Korn 스타일 인용문을 이해하는 것은 아닙니다. 바라보다"왜 printf가 echo보다 나은가요?전체 이야기를 말하자면, echo단일 특정 (버전) 셸 이외의 문제를 해결하려는 경우 왜 좋은 생각이 아닌가?

printf '\e[1m%s\e[22m' "$1"

SGR 0( 현재 일반적으로 발행되는 에 해당)이 꺼져 \e[0m있습니다 .tput sgr0모든 것, 아마도 당신이 원하는 것이 아닐 것입니다.반품밑줄, 기울임체, 색상, 반전 비디오 또는 기타 그래픽 표현을 사용하십시오. 굵게 끄기구체적으로, SGR 22는 볼드체와 페이드 기능을 끄고 "중간" 글꼴 두께를 복원하는 그래픽 렌더링 코드입니다. (이것에스기다리다G라피크오른쪽종료 제어 순서를 사용하면 굵게, 약간 굵게, 중간, 가벼움의 네 가지 글꼴 두께를 설정할 수 있습니다. )

너가 ~ 한 뒤로Z 쉘을 사용하면 다음을 수행할 수 있습니다.반품사용자체 내장 print명령전혀 사용하지 echo않거나 사용하지 않는 대신 . Z 쉘 프롬프트 확장 순서를 이해하기 위해 printf내장 기능을 만들 수 있습니다 .print

print -P '%B'"$1"'%b'

물론 $1문자열 자체에는 다른 확장 시퀀스가 ​​포함될 수 없으며, 굵게 변경되는 SGR 제어 시퀀스도 포함될 수 없습니다. 이는 tputterminfo 기능이 어떻게 작동하는지 배우는 데 어려움을 주지 않습니다 .

답변2

%매개변수 확장 플래그를 사용할 수 있습니다.

echo "${(%):-%B}$1${(%):-%b}"

zsh에는 프롬프트 확장을 수행 print해야 하는 내장 함수가 있습니다 -P(참고: $1에 프롬프트 시퀀스가 ​​포함된 경우 다음과 같이 해석됩니다).

print -P -- "%B$1%b"

첫 번째 위치 인수뿐만 아니라 모든 인수를 인쇄하고 싶을 수도 있습니다( $@/ 사용 $*).

인수가 주어지지 않으면 아무 것도 인쇄하고 싶지 않을 것입니다(개행 문자도 포함)( $#0보다 큰 경우에만 인쇄하거나 +인수 확장을 사용하여 print출력 열에 알려줍니다).

print -r백슬래시 이스케이프 문자( )의 에코와 유사한 해석을 비활성화할 수 있습니다 .

print_bold() {
  local IFS=' '
  print -rC1 -- ${1+"${(%):-%B}$*${(%):-%b}"}
}

"$*"첫 번째 문자로 구분된 위치 인수로 확장됩니다 IFS(기본적으로 공백이지만 위에서 명시적으로 설정됨).

관련 정보