【问题标题】:Using sed to replace last occurrence使用 sed 替换最后一次出现
【发布时间】:2015-01-22 12:54:09
【问题描述】:

我通过互联网收到this问题和其他问题,但无法解决以下情况:

输入字符串为: SF_db_gobfid01_20141209/SF_db_gobfid01_bat_20141209.lst

输出将是: SF_db_gobfid01_20141209/SF_db_gobfid01_bat_20150122.lst

但以下方法不起作用:

echo "SF_db_gobfid01_20141209/SF_db_gobfid01_bat_20141209.lst" | sed 's/20141209$/20150122/'

有什么解决办法吗?

【问题讨论】:

  • 它不起作用,因为 2041209$ 由于行尾锚点不匹配。您的输入包含2041209...之后的内容...

标签: linux string unix sed


【解决方案1】:
  • 删除线锚的末端。

  • 使用捕获组。

    echo "SF_db_gobfid01_20141209/SF_db_gobfid01_bat_20141209.lst" | sed 's/\(.*\)20141209/\120150122/'
    

    .* 默认是贪婪的。它将尽可能匹配所有字符。这样它就可以捕获直到最后一个数字20141209 的所有字符。在基本的sed中,捕获组写成\(..\),用于捕获字符。

【讨论】:

  • 它的工作,但我有另一个问题。如果想对这些日期使用可验证的,那么该使用什么? echo "SF_db_gobfid01_20141209/SF_db_gobfid01_bat_20141209.lst" | sed 's/\(.*\)$FIRST_DATE/\1$LAST_DATE/' 之类的代码不起作用
  • 将 sed 代码放在双引号内。 sed "s/\(.*\)$FIRST_DATE/\1$LAST_DATE/"
【解决方案2】:

使用/2 作为s 命令的参数(有关详细信息,请参阅this reference):

echo "SF_db_gobfid01_20141209/SF_db_gobfid01_bat_20141209.lst" | sed -r 's/20141209/20150122/2'
# prints "SF_db_gobfid01_20141209/SF_db_gobfid01_bat_20150122.lst"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-23
    • 2022-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-13
    • 2011-08-17
    相关资源
    最近更新 更多