我正在编写一个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
答案 0 :(得分:3)
您可以使用此sed:
sed -i '/OPQ_3\|OPQ_4/s/ABC_1/XYZ_2/' file
答案 1 :(得分:0)
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 完全读取一行的唯一方法,不会丢失任何空格或特殊字符。