我需要一个linux bash脚本来循环所有文件的文件夹并检查其中是否有字符串,更改其中的另一个字符串。例如,我们检查文件contanis AAAA然后用CCCC替换BBBB,如果没有AAAA,我们将DDDD更改为EEEE。
我写了一些代码,但我不确定它们是否正常工作:
#!/bin/bash
PATH = /path/to/files/* # files has no extension
for file in $PATH; do
if grep -q "AAAA" $file; then
replace "BBBB" "CCCC" -- $file
else
replace "DDDD" "EEEE" -- $file
fi
done
答案 0 :(得分:0)
一个单行做你的工作:
for i in /path/to/files/* ; do if grep -q AAAA "$i" ; then sed -i 's/BBBB/CCCC/g' "$i" ; else sed -i 's/DDDD/EEEE/g' "$i" ; fi ; done
答案 1 :(得分:0)
有两件事:PATH
不是一个好的变量名称,有关 PATH
变量的信息,请参阅here,我不熟悉replace
命令或其可用范围有多广,但sed
可能是更好的可移植性选择,sed -i 's/AAAA/BBBB/g'
会将AAAA
的所有值替换为文件BBBB
,你也应该引用你的变量:
#!/bin/bash
for file in /path/to/file/*; do
if grep -q "AAAA" "$file"; then
sed -i 's/BBBB/CCCC/g' "$file"
else
sed -i 's/DDDD/EEEE/g' "$file"
fi
done
$ cat f1.txt
AAAA
BBBB
DDDD
$ cat f2.txt
BBBB
DDDD
$ ./script.sh
$ cat f1.txt
AAAA
CCCC
DDDD
$ cat f2.txt
BBBB
EEEE
这会对目录产生问题,所以使用find
来改进文件,现在还可以处理带空格的文件:
#!/bin/bash
find /path/to/file/ -maxdepth 1 -type f -name | while IFS= read -r file
do
if grep -q "AAAA" "$file"; then
sed -i 's/BBBB/CCCC/g' "$file"
else
sed -i 's/DDDD/EEEE/g' "$file"
fi
done