首页 > 解决方案 > sed ack 搜索/用字符串替换换行符

问题描述

我研究了一些 SO 线程,但没有一个对我的具体情况有所帮助。

我正在尝试将PHP我从 php 5.6 接管到 php 8.0 的应用程序更新

话虽如此,有很多情况看起来像:

<?
echo ...
function

我需要找到所有直接跟在换行符<?后面的情况并将其替换为
<?php(newline)

根据我读过的SO帖子..我想我接近以下内容:

find ./ -type f -readable -writable -exec sed -i ":a;N;$!ba;s/\<\?\n/\<\?php\n/g" {} \;

我想我很接近了..但我不知道为什么它不会替换<?\n为该<?php\n语句sed没有换行符的情况下有效。但是根据这篇文章,看起来我做得正确。

我究竟做错了什么?

我尝试过的迭代:

$ find ./ -type f -readable -writable -exec sed -i ":a;N;$!ba;s/\<\?\n/\<\?php\n/g" {} \;

$ find ./ -type f -readable -writable -exec sed -i ":a;N;$!ba;s/<\?\n/<\?php\n/g" {} \;

$ find ./ -type f -readable -writable -exec sed -i ":a;N;$!ba;s/<?\n/<?php\n/g" {} \;

$ find ./ -type f -readable -writable -exec sed -i ":a;N;$!ba;s/<?\n\r/<?php\n/g" {} \;

$ find ./ -type f -readable -writable -exec sed -i ":a;N;$!ba;s/<?\r\n/<?php\n/g" {} \;

标签: linuxsedreplace

解决方案


sed 命令本身可能很简单:

sed -i 's/<?$/<?php/'

将其与 find 粘合在一起,它可能对您有用。

$是匹配行尾的锚点,您也可以考虑使用^将匹配锚定到开头:

s/^<?$/<?php/ 

推荐阅读