了解sed命令

时间:2018-07-07 17:11:50

标签: bash shell unix sed vi

我正在尝试更改父目录中包含的所有文件的第一行,以使它们继承其所在目录的路径名。 例如,我有一个文件,格式为:

  

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个小时,而我可以似乎没办法。 预先感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

您尚未发布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”,请发表评论,然后我们可以将其放在一起。

编辑: Abracadabra!

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