쉘에서 검색하고 교체하십시오
문제
나는 쉘 (bash) 스크립트를 작성하고 있으며 간단한 작업을 수행하는 쉬운 방법을 찾으려고 노력하고 있습니다.
변수에 문자열이 있습니다. 이것이 관련이 있는지 모르겠지만 실제로이 문자열은 전체 텍스트 파일의 내용이기 때문에 공백, Newlines를 포함 할 수 있습니다.
특정 하위 문자열의 마지막 발생을 다른 것으로 바꾸고 싶습니다. 아마도 나는 그것을 위해 Regexp를 사용할 수 있지만 나를 혼란스럽게하는 두 가지 순간이 있습니다.
- 처음부터 끝나지 않아야합니다.
- 스캔하려는 부분 문자열은 변수가 아닌 고정되어 있습니다.
해결책
- 처음에 잘린다.
${var#pattern}
- 끝에서 잘립니다
${var%pattern}
${var/pattern/repl}
일반 교체 용
패턴은 '파일 이름'스타일 확장이며 마지막 패턴은 다음과 같은 접두사를 사용할 수 있습니다. #
또는 %
시작 또는 끝에서만 일치하려면 (각각)
그것은 모두 (긴) Bash Manpage에 있습니다. "매개 변수 확장"장을 확인하십시오.
다른 팁
이와 같은 AMN 표현
s/match string here$/new string/
트릭을 수행해야합니다 - S는 Sustitute를위한 것입니다. / 명령을 나누고 $는 선 마커의 끝입니다. VI에서 이것을 시도하여 필요한 것을 확인할 수 있습니다.
나는 awk 또는 sed를 위해 남자 페이지를 찾아 볼 것입니다.
Javier의 답변은 쉘에 따라 다르며 모든 쉘에서 작동하지 않습니다.
SED는 Mrtelly와 Epochwolf가 언급 한 것에 대해 불완전하고 다음과 같이 보인다.
MyString="stuff ttto be edittted"
NewString=`echo $MyString | sed -e 's/\(.*\)ttt\(.*\)/\1xxx\2/'`
이것이 끝을 표시하기 위해 $를 사용하지 않고 작동하는 이유는 첫 번째 '*'가 탐욕스럽고 가능한 한 많이 모으려고 시도하면서 나머지 정규 표현이 사실이되기 때문입니다.
이 SED 명령은 사용 된 모든 쉘 컨텍스트에서 잘 작동해야합니다.
보통 SED에 갇히면이 페이지를 사용합니다.