我希望使用 sed 替换包含模式的字符串

我希望使用 sed 替换包含模式的字符串

我在名为 的文件中有以下行ref.list

234      ./XYZ_SiteMetric_TIMESTAMP.dat

456      ./XYZ_Site_TIMESTAMP.dat

我需要让它们:

234      SiteMetric

456      Site

我在脚本中使用以下命令:

sed -i 's/\*SiteMetric\*/SiteMetric/g' ref.list

sed -i 's/\*Site\*/Site/g' ref.list

列表文件中有很多类似的行。

当我使用 运行脚本时sh -x,没有错误并且命令正在执行。但文件中没有任何变化。

注意:XYZ_两行中的部分始终相同。但timestamp部分不同。

答案1

任意数量字符的语法是.**仅表示前一个字符或表达式的任意数量的匹配。也就是说,.*表示 的任意数量的匹配项.,可匹配任意字符。

答案2

更短的解决方案怎么样:

sed -ri -e 's%[.]/XYZ_(.*)_TIMESTAMP.dat%\1%' ref.list

它假设所有输入都遵循该模式。

答案3

假设您在 Site / SiteMetric 中没有_字符(不确定它是否是变量)并且模式是静态的,您可以这样做:

sed 's/\.[^_]*_//;s/_.*//;'

第一部分s将删除./XYZ_部分,第二部分将删除_TIMESTAMP.dat部分。

相关内容