在linux中搜索和替换文件(sed)

时间:2013-05-05 13:25:59

标签: regex sed

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

<?php 
<!DOCTYPE HTML>

<!DOCTYPE HTML>

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

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

但是我的服务器上没有找到任何带有针头串的文件实例。

2 个答案:

答案 0 :(得分:1)

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

修改:由于模式中的字符\n,以前的版本无法正常工作。更新版本避免使用此字符。

答案 1 :(得分: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