使用 sed 替换最后一次出现

Using sed to replace last occurrence

我在网上收到 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/'

有解决办法吗?

  • 删除行尾锚点。

  • 使用捕获组。

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

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

使用 /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"