使用 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//.//}/

阅读参数扩展bash 手册页 ( ${parameter/pattern/string}) 的部分,它还有许多其他有用的东西。

使用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

你在这里做了两件事sed

  1. 用斜杠替换所有点,并且
  2. 在行尾添加斜杠

sed第一个任务可以通过命令来完成y#.#/#。该y命令与该实用程序的工作方式类似tr,它将字符从一个字符串替换为另一个字符串,而不涉及正则表达式。这三个#是命令的分隔符(它通常使用/,如y/A-Z/a-z/小写A-Z范围内的所有字符),但就像命令一样s,我们可以使用我们想要的任何分隔符。

第二个任务可以通过使用 将行尾替换为斜杠来完成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/

当然,斜杠也可以用 the 插入,printf也可以用斜杠替换点tr

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

相关内容