【问题标题】:Changing the prefix of a file with sed使用 sed 更改文件的前缀
【发布时间】:2015-10-15 11:15:48
【问题描述】:

我想对这个脚本提出一些建议。
我正在尝试使用sed(我没有使用rename 管理它)来更改包含格式行的文件(我的测试文件名是sedtest):

COPY W:\Interfaces\Payments\Tameia\Unprocessed\X151008\E*.*

(这不是文件的唯一内容)。

我的目标是用不同的日期替换 151008 日期部分,我尝试使用以下方法在 sed 中提出解决方案:

sed -i -e "s/Unprocessed\X.*/Unprocessed\X'BLABLA'/" sedtest

但它似乎不起作用,该行保持不变,就好像因为\,它无法识别模式。我尝试了一些替代分隔符,例如#,但无济于事。

提前感谢您的任何建议。

【问题讨论】:

  • Sed(像许多 unix 工具一样)使用反斜杠来更改以下字符的“特殊性”。要更改反斜杠本身的特殊性,请在其前面放置一个反斜杠。

标签: bash replace sed filenames prefix


【解决方案1】:

您的 sed 命令存在一些问题。我建议将其更改为:

sed -r 's/(Unprocessed\\X)[0-9]+/\1BLABLA/' file

由于您的 sed 版本支持 -i 而无需您添加后缀来创建备份文件,我假设您使用的是 GNU 版本,它还支持带有 -r 开关的扩展正则表达式。该命令捕获() 中的部分并在替换\1 中使用它。不要忘记必须转义反斜杠。

如果您要使用-i,我建议您像-i.bak 那样使用,因此在覆盖之前将您的文件备份到file.bak

您没有显示您正在寻找的确切输出,但我假设您希望该行变为:

COPY W:\Interfaces\Payments\Tameia\Unprocessed\XBLABLA\E*.*

记住* 是贪婪的,所以.* 会匹配到行尾的所有内容。这就是为什么我把它改成[0-9]+,这样只有数字被替换了,剩下的行保持不变。


正如你提到的在替换中使用变量,你应该使用这样的东西:

sed -r -i.bak "s/(Unprocessed\\X)[0-9]+/\1$var/" file

这假定$var 可以安全使用,即不包含将被sed 解释的字符,例如\/&。有关可靠处理此类情况的详细信息,请参阅this question

【讨论】:

  • 作为参考,FreeBSD 和 OSX 还通过 -E 开关支持 ERE,并且在过去几年中,FreeBSD 还允许 -r 与 GNU sed 兼容。关于-i 的优点。加一。
  • 首先,非常感谢。这可以工作并将其输出到屏幕上,但有问题的文件保持不变..
  • 是的,这就是我想要的确切输出,有一个环境变量将进入那个 BLABLA
  • @onlyf 那是因为我删除了-i 开关。您可以将其放回去以编辑原始文件(考虑到我的回答中有关备份的建议)。
  • 我编辑了我的答案以显示如何在替换字符串中使用变量,链接到一个处理更复杂情况的问题。恐怕这超出了您最初问题的范围。一些通用提示:调试 sed 命令时不要使用-i,使用set -x 来查看正在运行的确切命令,并且不要在此处的 cmets 中转储 shell 命令/输出,这完全不可读。祝你好运。
猜你喜欢
  • 2011-04-11
  • 1970-01-01
  • 2018-08-12
  • 2018-10-20
  • 2012-10-10
  • 2019-11-09
  • 2020-11-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多