如何正确组合查找、sed 和 tr 以替换我所有文件中的换行符

How to correctly combine find, sed & tr to replace a newline in all my files

我的所有 PHP 个文件当前开始

<?php
    declare(strict_types=1);

这是一个小事,但我想把它们都改成

<?php declare(strict_types=1);

我想我需要使用 tr,因为 sed 一次只在一行上工作。但是我想不出正确的命令来通过 .php 个文件的目录递归执行此操作。

谢谢!

您可以使用 GNU sed 进行尝试:

find . -name *.php -exec sed -i '1{N;s/<?php\s*\n\s*declare/<?php declare/}' {} \;

find 位检索当前目录中的所有 .php 文件,sed 位就地编辑它们以将匹配的两行定义更改为单行定义线路定义。

它假定 php 开始标记在第一行,并寻找以 declare(和可选空格)开头的第二行。


如果您不使用 GNU sed,此命令应该 posix 兼容:

find . -name *.php -exec sed -i.bak '1{N;s/<?php[[:space:]]*\输入[[:space:]]*declare/<?php declare/}' {} \;

然而,它也会创建 .php 文件的备份,一旦确定命令成功,就可以通过额外的查找将其删除:

find . -name *.php.bak -delete