sed를 사용하여 마지막 문자 바꾸기

sed를 사용하여 마지막 문자 바꾸기

여러 줄 문자열 변수에서 마지막 문자를 바꾸려고 합니다.

마지막 |것을 `.

답변1

탐욕스러운 사실을 사용할 수 있습니다 .*.

sed 's/\(.*\)|/\1`/'

또는 다음을 사용하십시오:

sed 's/|\([^|]*\)$/`\1/'

|Toby가 보여주듯이, 타일 줄의 끝을 포함하지 않는 항목이 뒤에 따라 오지만 |이 방법은 단일 문자 대체에만 작동합니다.

GNU를 사용하여 여러 줄 문자열 셸 변수에서 이를 바꾸려면 입력을 개행 구분 대신 NUL 구분으로 처리하는 옵션을 sed사용할 수 있습니다 .-z

var=$(printf %s "$var" | sed -z '...')

또 다른 접근 방식은 대체를 위해 표준 매개변수 확산 연산자를 사용하는 것입니다.

case $var in
  (*'|'*) var=${var%'|'*}'`'${var##*'|'}
esac

또는 sed다음 명령을 해당 쉘 명령으로 변환합니다.

존재하다 ksh93:

var=${var/@(*)'|'/\1'`'}
var=${var/%'|'*([^'|'])/'`'\1}

In bash(문자열에 현재 로케일에서 유효한 문자를 형성하지 않는 일련의 바이트가 포함되어 있지 않다고 가정):

re='(.*)\|(.*)'
[[ $var =~ $re ]] && var=${BASH_REMATCH[1]}'`'${BASH_REMATCH[2]}

존재하다 zsh:

set -o extendedglob
var=${var/(#b)(*)'|'/$match[1]'`'}

var=${var/%(#b)'|'([^'|']#)/'`'$match[1]}

답변2

파이프하고 rev첫 번째 항목을 교체한 후 rev다시 파이프할 수 있습니다.

rev | sed -e 's/|/`/' | rev

또는 pure 에서는 sed교체하고 싶습니다.| 포함되지 않은 내용이 뒤따릅니다.|`동일한 순서가 이어집니다 .

sed -e 's/|\([^|]*\)$/`\1/'

나는 첫 번째 것이 읽고 이해하기 더 쉽다고 생각합니다.

답변3

$ printf '%s\n' "$str"
abc|def
ghi|jkl
$ printf '%s\n' "${str%\|*}"'`'"${str##*\|}"
abc|def
ghi`jkl
  • ${str%\|*}|제거 후 마지막 항목과 모든 항목이 포함된 문자열로 확장됩니다.
  • ${str##*\|}|삭제되기 전의 마지막 내용과 모든 내용을 포함하는 문자열로 확장됩니다.

`위의 두 매개변수 대체( 중간에 하나 포함) 를 조합하면 결과 문자열이 제공됩니다.

답변4

좀 더 "설교적인" 방식으로 @Stéphane Chazelas의 답변의 일부입니다...

sed -z 's/\(.*\)<YOUR_ESCAPED_TARGET>/\1<YOUR_ESCAPED_REPLACE>/'

이를 사용하면 여러 줄이 -z허용 <YOUR_ESCAPED_TARGET>되고 있다는 점에 유의하세요.<YOUR_ESCAPED_REPLACE>

노트:탈출 방법 <YOUR_ESCAPED_TARGET>과 탈출 방법을 설명하는 더 완전한 답변은 다음에서 찾을 수 있습니다.<YOUR_ESCAPED_REPLACE>여기.

감사해요!

관련 정보