如果文件中存在另一个字符串,则使用Linux bash脚本更改字符串

时间:2012-12-17 13:00:38

标签: linux bash shell

我需要一个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

2 个答案:

答案 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