【发布时间】:2018-12-15 22:38:24
【问题描述】:
我正在尝试更改父目录中包含的所有文件中的每一行,以便它们继承它们所在目录的路径名。 例如我有一个格式为:
2000-01-18
星期二
利文斯顿
42178
此特定文件位于名为 18 的目录中,位于名为 01 的另一个目录中,该目录位于名为 2000 的另一个目录中,该目录位于名为 filesToSort 的目录中。
我设法将此代码用作控制台命令来更改文件的第一行:
perl -pi -w -e 's/2000-01-18/Test/g;' ff_1177818640
这将文件更改为
测试
星期二
利文斯顿
42178
我是否可以更改此命令中的“日期”以选择所有日期,我尝试这样使用它:
perl -pi -w -e 's/*/Test/g;' ff_1177818640
但它根本不喜欢那样。
我目前的过程是,如果我可以让这个命令选择初始输入中的所有日期,那么一些如何找到一种方法将路径名实现到我目前使用这样的“测试”的第二部分:
path=/filesToSort/2000/01/18/ff_1177818640
file=$(basename "$path")
理论上我应该能够通过我的父目录和所有子目录运行整个代码,因此更改文件中的每个日期值,这些日期值出现在每个文件的第 1 行,在这些目录中以镜像文件路径他们所在的位置,有效地转换了一个看起来像这样的文件:
2000-xx-18
星期二
利文斯顿
42178
包含在目录 /filesToSort/2000/01/18 进入这个:
2000/01/18
星期二
利文斯顿
42178
我不确定我是否只是在这里使用了错误的 sed 命令,并且我应该使用另一个命令,但我一直试图让它工作 4 个小时,但我可以' t似乎钉它。 提前感谢您的帮助!
【问题讨论】:
-
"但它根本不喜欢那样。" -
*是正则表达式中的量词,因为它量化零个或多个 前面的字符或模式。不要将它与 shell 模式匹配(通配符)中使用的*混淆,它表示零个或多个任何字符,它在正则表达式中的等价物是.*。 -
啊好吧,所以如果我想在 unix 中使用相同的 experession,id 需要添加一个 .在它之前,它会以相同的方式运行吗?
-
“在 unix 中”是什么意思?有 globbing,由 unix shell 使用,而正则表达式几乎被其他所有东西使用,包括
sed(bash实际上支持两者)。两者都进行模式匹配,但元字符可以有不同的含义。 -
抱歉,目前仍在学习基础知识。因此,如果我要在 shell 中编写代码,我可以使用 * 但如果我要将其用作常规表达式,我将不得不使用 .* 代替?如果 bash 两者都支持,这是否意味着我可以使用其中任何一个,还是取决于我正在编写的代码的上下文?