【问题标题】:Inserting headers into multiple files将标题插入多个文件
【发布时间】:2022-03-29 04:13:10
【问题描述】:

我发现了一些带有 Perl 的命令行,它可以将标题插入到我的文件中,而无需经历一个一个插入它们的繁琐过程。有人可以带我了解这个命令行的 Perl 方面吗?我是新手,似乎无法为我写的内容找到正确的解释。

cat header.txt | perl -0 -i -pe 'BEGIN{$h = <STDIN>}; print $h' 1*

【问题讨论】:

  • 它真的有效吗? BEGIN 块内的语法似乎不正确
  • 是的,它运行并完成了我想要它做的事情!
  • 所以我尝试在没有 BEGIN 的情况下运行它,它只编辑了第一个文件。我相信它也删除了文件中的其余数据。
  • 在你不知道它在做什么的地方运行代码是个坏主意。

标签: perl


【解决方案1】:

-e 与其在 xxxx.pl 文件中提供脚本,不如在命令行中提供它

-p 使它像 sed 一样迭代文件名参数,但还在脚本末尾打印 $_ 的内容。

以上两个组合在-pe中

-i 表示您要就地编辑文件并将输出写入同一文件。在实践中,Perl 重命名输入文件并从这个重命名的版本中读取,同时写入具有原始名称的新文件

-0 重新定义记录结束字符(默认为\n),以便您可以将整个输入文件作为单行读取

1* 是脚本的命令行参数,所以我猜您正在修改任何名称以 1 开头的文件(您可以使用 *.c,或者根据您尝试修改的文件类型使用其他任何文件)

打印 $h 打印作为脚本“主要”的变量 $h。如果它是用头文件的内容初始化的(这一行的意图),那么它将打印头文件

BEGIN{ 这里有一些代码 } 这是您在脚本启动之前执行的内容。这就是我难过的地方。这似乎不是有效的 perl 代码

基本上就是这样:

  • 这应该会在 BEGIN 块中 slurp 整个头文件(因为 -0)并将其存储在变量 $h 中
  • 遍历命令行末尾通配符指定的所有文件
  • 对于每个文件:打印标题(打印 $h)然后打印 hte 文件本身(因为 -pe)

所以相当于把脚本拼出来:

$h = gets content of the entire header file
while (<>){ #loop implied by -pe, iterates over all the 1* files
    # the main contents of the "-e" script are inserted below as part of executing -pe
    print h$; #print the header we saved 
    print $_; # implied by -pe, and since we are using -0, this prints the entire content in one shot
    # end of the "-e" script. again it was a single print $h statement, the second print is implied by -pe
} 

有点难解释,详细请看perlrun文档(运行man perlrun)。

这不是 100% 完整的解释,因为我不认为 BEGIN 块是正确的。我在我的 ubuntu 机器上尝试过,它也抱怨它的语法

【讨论】:

    【解决方案2】:

    这里有类似的东西,有一个解释。问题中的程序无法在我的 Mac 上运行。

    我需要将 #nullable disable 指令添加到我所有 csharp 文件的顶部,作为 migrating 的一部分到可为空的引用类型。

    perl -w -i -p -0777 -e 's/^/#nullable disable\n\n/' $(find . -iname '*.cs')
    
    • -w 启用警告
    • -i就地编辑文件
    • -p 逐块读取每个文件,在应用 perl 表达式后打印每个块。默认块大小为一行
    • -0777 将默认块大小更改为整个文件
    • -e 要执行的 perl 表达式

    最后一个参数使用 shell 命令替换来创建文件列表。它将文件路径列表传递给 perl 命令。 find 命令搜索以.cs 结尾的文件。

    perl 程序是一个单一的替换命令。它匹配块的最开始,并用“#nullable disable”和几个换行符替换(实际上是前置)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-10
      • 2021-12-25
      • 1970-01-01
      相关资源
      最近更新 更多