在 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
为假时才执行。
我正在使用 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
为假时才执行。