尝试遍历目录中的所有文件,检查它们是否存在字符串,如果不存在则添加它。这就是我所拥有的:
#!/bin/bash
FILES=*
for f in $FILES
do
echo "Processing $f file..."
if grep -Fxq '<?xml version="1.0" encoding="UTF-8"?>' $f
then
continue
else
echo '<?xml version="1.0" encoding="UTF-8"?>' | cat - $f > temp && mv temp $f
fi
done
…但是脚本在第一个循环后停止。有什么想法吗?
一个更简单的解决方案是使用如下所示-i
的sed
工具的就地编辑选项
sed -i '1{/^<?xml version="1.0" encoding="UTF-8"?>/!{
s/^/<?xml version="1.0" encoding="UTF-8"?>\n/}}' /path/to/files/*
我们在上面做什么
-i
以sed
使任何更改写入到文件的文件。1{}
我们只处理文件的第一行/^<?xml version="1.0" encoding="UTF-8"?>/!
部分检查字符串是否在行的开头不存在(请注意末尾的!)。如果上述条件不成立,我们代替行的开头(^
含)<?xml version="1.0" encoding="UTF-8"?>\n
使用
s/^/<?xml version="1.0" encoding="UTF-8"?>\n/
就是说,在您的原始脚本中,我看到了类似的变量FILES
。不建议将大写变量用作用户变量,因为它们被保留为环境变量并可能导致冲突。因此请files
改用。
再次做
file=*
如果您有包含空格甚至是换行符的非标准文件,则具有[单词拆分]的含义,并且会产生不希望的结果。你能做的是
files=( * ) # This put the files in an array
for file in "${files[@]}" # Double quoting the array prevents word splitting
do
# Do something with "$file" but why bother when you've a one-liner with sed? ;-)
done
注:对于sed
手动访问[这里]
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句