% x=abracadabra
% echo ${x//a/o}
obrocodobro
흡입……
교체할 수 있는 방법이 있나요마지막sed
패턴 발생을 대체하기 위해 쉘을 사용하시겠습니까(IOW, , 등 awk
을 밀어내지 않음 perl
)?
답변1
참고: 이는 후행 발생을 대체합니다. "마지막 발생"과 완전히 동일하지는 않습니다.
~에서Bash 참조 매뉴얼 섹션 3.5.3 쉘 매개변수 확장 :
${parameter/pattern/string}
파일 이름 확장과 마찬가지로 패턴을 확장하여 패턴을 생성합니다. 매개변수가 확장되고 패턴과 해당 값과 가장 오랫동안 일치하는 항목이 문자열로 대체됩니다. 패턴이 "/"로 시작하면 해당 패턴이 모두 문자열로 대체됩니다. 일반적으로 첫 번째 발생만 대체됩니다. 패턴이 "#"으로 시작하는 경우 매개변수의 확장된 값의 시작 부분과 일치해야 합니다.패턴이 "%"로 시작하는 경우 매개변수의 확장된 값 끝과 일치해야 합니다.문자열이 비어 있으면 일치하는 패턴이 제거되고 다음 / 패턴이 생략될 수 있습니다. nocasematch 셸 옵션이 활성화된 경우(Shoptbuildin의 shopt 설명 참조) 알파벳 문자의 대소문자에 관계없이 일치가 수행됩니다. 매개변수가 "@" 또는 "인 경우'를 사용하면 각 위치 인수에 대체 연산이 차례로 적용되고 확장이 결과 목록이 됩니다. 매개 변수가 배열 변수인 경우 아래 첨자는 "@" 또는 "', 대체 연산이 배열의 각 구성원에 차례로 적용되고 확장이 결과 목록입니다.
그래서
$ x=abracadabra
$ echo "${x/%a/o}"
abracadabro
답변2
쉘 대체를 통해 이 작업을 수행할 수 있지만 약간 까다롭습니다. 기본적으로 패턴 뒤의 모든 것을 잡는 대신 패턴이 대체 항목을 삽입하기 전에 모든 것을 잡을 수 있습니다. 귀하의 예를 들면 다음과 같습니다.
x=abracadabra
echo "${x%a*}o${x##*a}"
편집: 아니면 Steeldriver가 댓글에서 제안한 대로 하세요.