【问题标题】:Replace character in substring after character using SED or AWK使用 SED 或 AWK 在字符后替换子字符串中的字符
【发布时间】:2020-04-03 02:42:49
【问题描述】:

我有一个动态字符串,需要替换字符串中的一个字符,但仅限于字符串的最后部分。

示例字符串:

Microsoft|Application-Local|Installed on system|win:application-local

我需要将字符串中的“-”替换为“:”,但仅限于字符串的最后部分。

想要的字符串:

Microsoft|Application-Local|Installed on system|win:application:local

字符串中的数据会发生变化,但“win:”除外。是否可以说从“win:”开始查看字符串的末尾将任何“-”替换为“:”

我很难弄清楚我的逻辑。

【问题讨论】:

  • 你有一些失败的尝试吗?发布相同的
  • sed -e 's/\(win:[^-]*\)-/\1:/'
  • echo "$s" | rev | sed 's/-/:/' | rev

标签: awk sed


【解决方案1】:

给定:

$ s='Microsoft|Application-Local|Installed on system|win:application-local'

使用 sed:

$ echo "$s" | sed -e 's/\(win:[^-]*\)-\([^-]*$\)/\1:\2/'
Microsoft|Application-Local|Installed on system|win:application:local

或 Perl:

$ echo "$s" | perl -lpe 's/(win:[^-]*)-([^-]*)$/\1:\2/'
Microsoft|Application-Local|Installed on system|win:application:local

如果win:... 部分始终是最后一个,则不需要第二个捕获组。

【讨论】:

  • 非常感谢您的帮助
【解决方案2】:

如果使用 sed 或 awk 不是强制性的,那么 shell parameter expansion 来救援:

STR="Microsoft|Application-Local|Installed on system|win:application-local"
echo ${STR%-*}:${STR##*-}

在上面的sn-p中

${STR%-*} 表示“STR 没有尾部 -* 正则表达式的最短匹配”

${STR##*-} 的意思是“STR 中没有最长的*- 正则表达式”

【讨论】:

  • 非常感谢您的帮助。
【解决方案3】:
$ awk 'BEGIN{FS=OFS="|"} {sub(/-/,":",$NF)} 1' file
Microsoft|Application-Local|Installed on system|win:application:local

到目前为止发布的其他解决方案中的一些(可能是全部,idk - 测试它们)适用于您提供的 1 个示例输入行,但由于不同的输入(例如最终没有 - 的输入)而失败字段或输入在最终字段中没有某些特定字符串(如 win)或在较早的字段中包含它等,因此您可能想要提出一些涵盖所有用例的更全面的输入/输出进行测试。

【讨论】:

  • 感谢 Ed 非常感谢您的帮助。
猜你喜欢
  • 2020-02-18
  • 2015-01-13
  • 2017-02-08
  • 2012-10-15
  • 2019-08-07
  • 2019-11-21
  • 2012-12-21
  • 2015-05-10
  • 2015-12-18
相关资源
最近更新 更多