仅在固定行中替换文件

时间:2014-03-26 14:57:48

标签: linux bash shell

我正在编写一个shell脚本,我将在其中读取文件并对其进行修改。 会在多行中出现一些字符串“ABC_1”。 只有当行中还存在“OPQ_3”时,我才需要用“XYZ_1”替换它,否则行中不应该修改。 如果我读了一行比较的文件,请帮助我如何更换。

for FILE in $FILES 
 do
   echo $FILE
   while read line
   do 
    if grep -n "OPQ_3" $line
      then

      sed -i 's/ABC_1/XYZ_2/'
    fi

   done  < $FILE
 done

2 个答案:

答案 0 :(得分:3)

您可以使用此sed:

sed -i '/OPQ_3\|OPQ_4/s/ABC_1/XYZ_2/' file

答案 1 :(得分:0)

Anubhava有更好的答案。这是你用bash写的方式

for file in $FILES; do
    echo "$file"
    tmpfile=$(mktemp)
    while IFS= read -r line; do 
        [[ $line == *OPQ_3* ]] && line=${line/ABC_1/XYZ_2/}
        echo "$line"
    done < "$file" > "$tmpfile"
    mv "$tmpfile" "$file"
 done

注意IFS= read -r line是从stdin 完全读取一行的唯一方法,不会丢失任何空格或特殊字符。