(正则表达式,sed)如何在擦除单词后附加已擦除的单词

(regex,sed) How to append erased word after erasing word

我想改变什么

.:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:.:/sbin:/bin  

我想做什么

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:.  

我想拾取所有点 ("."),并想附加到行尾。
如果行中没有点(“.”),则只打印该行。

我可以擦掉有点的行中的点。但在这种情况下,我无法将点附加到行尾 (/\.:/)。

$ echo /usr/local:.:/bin | sed -r -e "/\.:/s/(\.:)//g"

如何在擦除单词后追加已擦除的单词,仅使用 sed 命令?

您可以将另一个表达式附加到 sed:-e "s/:?$/:./".

这意味着:用点替换行尾(以及任何最终的尾随冒号)。

您可以使用

#!/bin/bash
s='.:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:.:/sbin:/bin'
sed -r -e 's/(.+)\.:/.:/' -e 's/(.)\.://g' -e 's/\.:(.+)/:./' <<< "$s"
# => /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:.  

online demo

这里,

  • s/(.+)\.:/.:/ 在您的字符串中的任意位置找到一个 .: 子字符串,并将找到的 .: 移动到字符串的开头
  • s/(.)\.://g 删除字符串中的所有非初始 .: 字符组合,然后
  • s/^\.:(.+)/:./ 删除字符串开头的 .: 并在结尾粘贴 :.