【问题标题】:Understanding the sed command了解 sed 命令
【发布时间】: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 使用,而正则表达式几乎被其他所有东西使用,包括sedbash 实际上支持两者)。两者都进行模式匹配,但元字符可以有不同的含义。
  • 抱歉,目前仍在学习基础知识。因此,如果我要在 shell 中编写代码,我可以使用 * 但如果我要将其用作常规表达式,我将不得不使用 .* 代替?如果 bash 两者都支持,这是否意味着我可以使用其中任何一个,还是取决于我正在编写的代码的上下文?

标签: bash shell unix sed vi


【解决方案1】:

在我看来,您要做的基本上是将“-”翻译为“/”。您可以找到该文件,对其进行备份(总是一个好主意),然后使用:

    sed 's|-|/|g' <path/backup_file >path/modified_file

也就是说,如果是相同的分配,您可以使用该命令复制到其新目录并同时修改文件。

【讨论】:

  • 假设文件中的日期是准确的。
  • 嗯,这就是 OP 在文件中所说的......而且,根据之前的帖子,这些文件是根据第一行日期放置在这些目录中的......很好 sed 获得内部顺便说一下目录。
【解决方案2】:

您还没有发布 sed 命令,所以很难知道什么会起作用。让我们一步一步来。试试这个:

sed -i '1s/^/X/' ff_1177818640

并查看是否修改了文件(将“X”添加到第一行的开头)。如果你的 sed 版本不喜欢这样,试试这个:

sed -i "" '1s/^/X/' ff_1177818640

一旦语法正常工作,我们必须解决将路径转换为日期的问题。试试这个:

echo some/path/filesToSort/2000/01/18/ff_1177818640 | sed 's|.*/filesToSort/||; s|/[^/]*$||'

如果生成“2000/01/18”,请发表评论,我们可以将它们放在一起。

编辑: 将它们放在一起。 阿布拉卡达布拉!

find . -type f -exec sed -i "1{s|.*|{}|;s|.*/filesToSort/||;s|/[^/]*$||;}" {} \;

【讨论】:

  • 当我尝试在线搜索如何执行此操作时,我刚刚得到那段代码,并认为 sed 命令是语法的一部分或其他东西您提供的第一个 sed 命令有效,并在开头添加了 X在该行中,echo 命令然后给出了这个结果 /testarea/2000/01/18 我暂时将文件移动到“testarea”,所以我不会搞砸任何事情。
  • 我试图用这个 sed 命令实现的主要目的是获取文件路径并使用它来更改文件中的日期,我有包含空值的文件x' like 2000-xx-18 inside /filesToSort/2000/01/18 我正在尝试使用这个 sed 命令从文件路径中获取 2000-01-18 的日期,并用这个替换文件中的日期行路径
  • 抱歉,那个 echo 命令确实给了我你所说的确切结果
  • 我会使用某种 for 循环来表示每个带有 xx 的文件,将其转换为文件路径吗?
  • @RhysWilliams:不仅仅是带有“xx”的文件,而是所有文件。我刚刚添加的find 命令将每个文件的第一行(工作目录下方)替换为从路径构造的字符串。附言请注意,我已将“filesToSort”硬编码为树中顶级目录的名称;您可以将其更改为“testarea”,或者您正在使用的任何内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-07-05
  • 2021-12-25
  • 1970-01-01
  • 2014-12-13
  • 1970-01-01
  • 2018-10-28
  • 1970-01-01
相关资源
最近更新 更多