여러 줄 문자열 변수에서 마지막 문자를 바꾸려고 합니다.
마지막 |
것을 `
.
답변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>
여기.
감사해요!