在 if else 中嵌套 Find 和 sed 命令

Nesting Find and sed command in if else

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

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

考虑到我有多个文件需要替换。在给定的情况下,我要替换的主题不可用。 有没有一种方法可以先检查文件是否包含属性 'Subject' 如果不包含我需要执行另一个命令。即

检查文件是否包含字符'Subject'

如果为真则执行上面的代码1

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

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

有什么想法吗?提前致谢

您可以像这样在进程替换中使用 find

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

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

像这样的东西应该有用。

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

-exec 获取它执行的命令的退出代码,因此 -exec grep -q "Subject" {} \; 只有在 grep 为真时才为真。并且由于短路 -o(或)的优先级低于其他运算符之间隐含的 -a(和),相反,它应该仅在 grep 为假时才执行。