2016-07-08 40 views
0

我有这个文件httpd.conf,我想找到EnableSendfile,而不是包含字符串的行,但该行开始以“#”(没有注释行),如果发现我想将其值重置为关闭。查找和替换在文件或字符串在bash

我试图想出这个。 (我是bash语言的新手) 但它不工作。

我想在我的搜索和替换命令中使用变量,因为我稍后将使用数组项来循环键和它们的值,因此我需要使用变量而不是纯字符串。

感谢您的帮助,提前!

#!/bin/bash 
SEARCH="EnableSendfile" 
FILEPATH="/root/scripts/httpd.conf" 
REPLACE="off" 

if grep -Fq $SEARCH $FILEPATH 
then 
    line_string=`sed -n '/^EnableSendfile/p' $FILEPATH` 
    result_string="${line_string/(^[^#]\w*)(?:\s(\w+))?$/$REPLACE}" 
    echo $result_string 
else 
    echo "not found" 
fi 
# 
# EnableMMAP and EnableSendfile: On systems that support it, 
# memory-mapping or the sendfile syscall may be used to deliver 
# files. This usually improves server performance, but must 
# be turned off when serving from networked-mounted 
# filesystems or if support for these functions is otherwise 
# broken on your system. 
# Defaults if commented: EnableMMAP On, EnableSendfile Off 
# 
#EnableMMAP off 
EnableSendfile on 
#EnableSendfile on 

# Supplemental configuration 
# 
# Load config files in the "/etc/httpd/conf.d" directory, if any. 
IncludeOptional conf.d/*.conf 

回答

0

使用sed

sed 's/^EnableSendfile on/EnableSendfile off/' 

^特殊字符的行的开头匹配,所以该命令将不会改变行开始用#

+0

hhow我可以使用变量与sed,sinc我打算稍后使用数组项来循环键和它们的值,因此我需要使用变量而不是普通字符串 – Vagho

+0

如果变量从不包含特殊字符,你可以在双引号中使用它们:'“/关键字/ $关键字/”'。否则,你需要一个更复杂的解决方案。 – choroba

+0

好的.i能够做到这一点,但显然它不是保存它只是在屏幕上显示文件,如何保存或替换原始文件? – Vagho