【问题标题】:Remove closing PHP tags from all files从所有文件中删除关闭 PHP 标记
【发布时间】:2019-10-22 00:16:36
【问题描述】:

我正在尝试从网站上的 PHP 文件末尾查找并删除所有关闭的 PHP 标记 ?>

我用过:

find . -type f -exec sh -c 'tail -n 1 "$1" | grep -q "?>" && printf "%s\n" "$1"' -- {} \;

这给了我一个以 PHP 标记结尾的所有文件的列表,这是预期的,但该列表也超过 500 个文件,因此手动浏览需要很长时间。

如果可能的话,我正在寻找一种相对简单的方法来做到这一点。

我试过像这样使用sed

 find . -type f -exec sh -c 'tail -n 1 "$1" | grep -q "?>" && printf "%s\n" "$1"' -- {} \; | sed -i '$ d' ./*

但这有两个问题;它不会进入目录,它会从 all 文件中删除最后一行,而不仅仅是那些有 PHP 结束标记的文件。

我希望它能在最后一行找到所有带有?> 的文件(我可以让它工作),然后删除带有标签的最后一行。

我觉得我很接近,只是错过了一些东西。

【问题讨论】:

    标签: linux sed terminal


    【解决方案1】:

    要删除包含?> 的最后一行,您可以使用

    sed '${/?>/d;}'
    

    '${/?>/d;}' 表示:

    • $ - 只获取最后一行
    • /?>/ - 仅当包含 ?> 文本时才匹配该行
    • d - 删除该行。

    要在目录上递归运行 sed 命令,请使用

    cd /your/dir/here && find . -type f -print0 | xargs -0 sed -i '${/?>/d;}'
    

    How to do a recursive find/replace of a string with awk or sed?查看更多关于递归文件匹配的具体解决方案

    【讨论】:

    • 对不起,这似乎不起作用。当我输入命令时,它只是将我带到另一行
    • @Ember 不知道你所说的“进入另一行”是什么意思,sed 命令removes the last line if it contains ?>
    • 对不起,我的评论应该更清楚。当我在终端中按 enter 时,似乎什么也没有发生,终端中的光标只是移动到下一行
    • 我设法让它一次在一个目录中工作,但它没有进入任何子目录
    • 这似乎行得通!谢谢,我正在查看您链接的问题,但遗憾的是我不是那么精通终端(我正在学习)。在我接受答案以仔细检查一切是否按预期工作(我相信它会)之前,我将再进行一些测试。
    猜你喜欢
    • 2015-08-03
    • 2017-04-17
    • 2020-06-15
    • 2014-01-04
    • 1970-01-01
    • 2017-09-09
    • 1970-01-01
    • 2017-11-03
    • 1970-01-01
    相关资源
    最近更新 更多