首页 > 解决方案 > (regex,sed) 擦除单词后如何附加擦除的单词

问题描述

我想改变什么

.:/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命令附加擦除的单词?

标签: regexsedreplaceshposix-ere

解决方案


您可以使用

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

查看在线演示

这里,

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

推荐阅读