【问题标题】:(regex,sed) How to append erased word after erasing word(regex,sed) 擦除单词后如何附加擦除的单词
【发布时间】:2021-03-16 09:40:49
【问题描述】:

我想改变什么

.:/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"

我怎样才能在我擦除单词后附加擦除的单词,只能使用sedcommand?

【问题讨论】:

  • 你真的需要使用sed吗?在 Awk 中会容易得多!

标签: regex sed replace sh posix-ere


【解决方案1】:

你可以使用

#!/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:.  

online demo

这里,

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

【讨论】:

  • 感谢您的回复。顺便说一句,如果输入行中没有点(“.”),您的正则表达式将在行尾打印点。在这种情况下我该如何解决?比如输入行->/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin这两种情况我应该做一个sed命令吗?
  • @GRu.L 如果没有点,我上面的代码不会添加它们,请参阅the sed demo 和新字符串。如果您不使用我的代码,请分享您的代码。
  • 对不起,你是对的。我在阅读您的代码时感到困惑。但是在这种情况下(点存在于行中间), ->/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:.:/sbin:/bin 那么你的代码不会在行尾打印点。
  • @GRu.L 好的,我明白了,使用sed -r -e 's/(.+)\.:/.:\1/' -e 's/(.)\.:/\1/g' -e 's/\.:(.+)/\1:./'
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    • 1970-01-01
    • 1970-01-01
    • 2018-01-15
    • 1970-01-01
    • 2013-03-29
    相关资源
    最近更新 更多