2015-09-07 83 views
0

我正在使用find和sed命令替换文件中的字符。看到下面的代码1将嵌套查找和sed命令放在其他位置

find . -type f -exec sed -i '/Subject/{:a;s/(Subject.*)Subject/\1SecondSubject/;tb;N;ba;:b}' {} + 

鉴于我有多个文件,我需要更换。在特定情况下,我试图替换的主题不可用。 有没有一种方法可以首先检查文件是否包含属性'主题',如果不是我需要执行另一个命令。即

检查,如果该文件包含字符“主题”

如果为true,则执行上述

代码1如果没有主题的情况下执行以下

find . -name "*.html" -exec rename 's/.html$/.xml/' {} ; 

任何想法码2 ?在此先感谢

+0

在这种情况下使用'grep -r -l代替查找 – NeronLeVelu

回答

2

这样的事情应该工作。

find . -type f \(\ 
-exec grep -q "Subject" {} \; \ 
-exec sed -i '/Subject/{:a;s/(Subject.*)Subject/\1SecondSubject/;tb;N;ba;:b}' {} \; \ 
-o \ 
-exec rename 's/.html$/.xml/' {} \; \) 

-exec需要它执行命令的退出代码,所以-exec grep -q "Subject" {} \;如果grep的是真的只会是真实的。并且由于短路-o(或)的优先级低于其他运营商之间暗示的-a(和),所以它应该相反只有在grep为假时才会执行。

+0

它现在工作..谢谢 –

0

你可以在这样的过程中替换使用find

while IFS= read -d'' -r file; do 
    echo "processing $file ..." 

    if grep -q "/Subject/" "$file"; then 
     sed -i '{:a;s/(Subject.*)Subject/\1SecondSubject/;tb;N;ba;:b}' "$file" 
    else if [[ $file == *.html ]]; then 
     rename 's/.html$/.xml/' "$file" 
    fi 
done < <(find . -type f -print0) 
+1

嗨Anub ..我会试一试并回复你。再次感谢 –