複数行の文字列変数で最後の文字を置き換えようとしています。
最後の|
もの`
。
答え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##*\|}
|
削除される前の最後の内容とすべての内容を含む文字列に展開されます。
`
上記の2つのパラメータ置換(中間に1つを含む)を組み合わせると、結果の文字列が得られます。
答え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>
ここ。
ありがとうございます!