![我希望使用 sed 替换包含模式的字符串](https://linux22.com/image/167941/%E6%88%91%E5%B8%8C%E6%9C%9B%E4%BD%BF%E7%94%A8%20sed%20%E6%9B%BF%E6%8D%A2%E5%8C%85%E5%90%AB%E6%A8%A1%E5%BC%8F%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2.png)
我在名为 的文件中有以下行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
部分。