在if else中嵌套查找和sed命令

时间:2015-09-07 08:39:25

标签: regex bash sed find

我使用find和sed命令替换文件中的字符。见下面的代码1

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

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

检查文件是否包含字符'主题'

如果为true,则执行上面的代码

如果下面没有主题执行代码2的实例

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

任何想法?提前致谢

2 个答案:

答案 0 :(得分: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为假,则应该反过来执行。

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