문제

나는 쉘 (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에 갇히면이 페이지를 사용합니다.

http://sed.sourceforge.net/sed1line.txt

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top