行末に追加するには、sedを使用してください。

行末に追加するには、sedを使用してください。

私の問題を解決したい他の答えを見ましたが、解決できません。

#!/bin/bash
s=org.gnome.Terminal.Legacy.Keybindings
g=$(echo $s | sed "s|\.|/|g") 
echo $g

上記のスクリプトが返されました。

org/gnome/Terminal/Legacy/Keybindings

/しかし、最後に追加する必要があります。

org/gnome/Terminal/Legacy/Keybindings/

このためにsedスクリプトをどのように拡張できますか?

答え1

bashを使用している場合、実際にsedは必要ありません。

s="org.gnome.Terminal.Legacy.Keybindings"
g=${s//.//}/

読むパラメータ拡張${parameter/pattern/string}他の多くの有用な情報を含むbashのマニュアルページ()セクションを参照してください。

sed では複数の式を指定することもできます。

s="org.gnome.Terminal.Legacy.Keybindings"
g=$(sed -e 'y,.,/,' -e 's,$,/,' <<<$s)

リテラル文字を受け入れるコマンドを使用するときは、エスケープする必要はyありません。.y

答え2

この試み:

sed 's/\.\|$/\//g'
  • |シフト演算子です。
  • $行の終わりと一致します。

デモ:

%echo org.gnome.Terminal.Legacy.Keybindings|sed 's/\.\|$/\//g'
org/gnome/Terminal/Legacy/Keybindings/

答え3

sed方法:

s="org.gnome.Terminal.Legacy.Keybindings"
g=$(echo $s | sed "y|.|/|; s|$|/|")
echo $g
org/gnome/Terminal/Legacy/Keybindings/

  • y|\.|/|- すべてのポイントを.スラッシュに変換/

答え4

ここでは2つのことを行いますsed

  1. すべての点をスラッシュに変えて
  2. 行末にスラッシュを追加

sed最初の操作はコマンドで実行できますy#.#/#。このコマンドは、正規表現を使用せずにある文字列から別の文字列に文字を変更するという点で、yこのユーティリティと同様に機能します。trこれら3つは#コマンドの区切り文字です(通常は/小文字y/A-Z/a-z/の範囲内のすべての文字を使用しますA-Z)。ただし、コマンドと同様に、s必要な区切り文字を使用できます。

2番目の操作は、を使用して行末をスラッシュに置き換えることによって実行できますs#$#/#

これを合わせると我々は得る。

sed -e 'y#.#/#' -e 's#$#/#'

スクリプトから:

#!/bin/bash
s='org.gnome.Terminal.Legacy.Keybindings'
g=$( sed -e 'y#.#/#' -e 's#$#/#' <<<"$s" )
printf '%s\n' "$g"

これは生産します

org/gnome/Terminal/Legacy/Keybindings/

もちろん、スラッシュを使用して挿入することも、printfポイントをスラッシュに置き換えることもできますtr

#!/bin/bash
s='org.gnome.Terminal.Legacy.Keybindings'
g=$( tr '.' '/' <<<"$s" )
printf '%s/\n' "$g"

関連情報