0

我正在尝试搜索和替换以下内容:

<?php 
<!DOCTYPE HTML>

<!DOCTYPE HTML>

到目前为止,我已经尝试过:

find . \( -name "*.php" \) -exec grep -Hn "<?php <\!DOCTYPE HTML>" {} \; -exec sed -i 's/<?php <\!DOCTYPE HTML>/<\!DOCTYPE HTML>/g' {} \;

但它没有找到我的服务器上存在的带有我的针字符串的任何文件实例。

4

2 回答 2

1
find . -name "*.php" -exec grep -lZz '^<?php[[:space:]]\+<!DOCTYPE HTML>' {} + |
xargs -r0 sed -i '^<?php[[:space:]]*$/,1d'

编辑:由于模式中的字符,以前的版本不起作用\n。更新版本避免了这个字符。

于 2013-05-05T13:46:18.517 回答
1

使用 GNU awk(用于RS='\0'将整个文件作为一条记录读取)并假设您的文件名不包含换行符,您所需要的只是清晰、简单:

find . -name '*.php' -print |
while IFS= read -r file; do
    gawk -v RS='\0' '{gsub(/<\?php\n<!DOCTYPE HTML>/,"<!DOCTYPE HTML>"); print}' "$file" > tmp &&
    mv tmp "$file"
done
于 2013-05-06T00:39:54.663 回答