我使用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/' {} ;
任何想法?提前致谢
答案 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)