在 Unix 中使用 sed 命令

在 Unix 中使用 sed 命令

如何从文件中取出一个单词并将其更改为绝对路径?基本上我需要从 unix 文件中取出一个单词并将其更改为该文件中的绝对目录路径。文件名为httpd.conf。该文件的路径是/home/Tina/apache/conf/httpd.conf。该行是 ServerRoot“/usr”。我需要将“/usr”更改为/home/Tina/apache。

Tina@Irv-PC ~/apache/conf
$ cat httpd.conf
#
# This is the main Apache HTTP server configuration file. It contains the
# configuration directives that give the server its instructions.

# Do not add a slash at the end of the directory path.
#
ServerRoot "/usr"

#
# DocumentRoot: The directory out of which you will serve your documents.
#
DocumentRoot "/Library/WebServer/Documents"

答案1

尝试这个:

$ sed -i.orig '/ServerRoot/s_"/usr"_/home/Tina/apache_' /home/Tina/apache/conf/httpd.conf

如果你想在周围加上双引号/home/Tina/apache

$ sed -i.orig '/ServerRoot/s_"/usr"_"/home/Tina/apache"_' /home/Tina/apache/conf/httpd.conf

首先,我们匹配该行是否包含“ServerRoot”( /ServerRoot/),如果是,则我们进行了所需的替换( s_"/usr"_"/home/Tina/apache"_)。正如您/在路径中所使用的那样,我们使用了替换分隔_sed。修改后的文件将为/home/Tina/apache/conf/httpd.conf,原始文件将保留为/home/Tina/apache/conf/httpd.conf.orig.

答案2

为了避免副作用,我将替换整行:

sed -i.bak -e 's#^ *ServerRoot  *"/usr" *$#ServerRoot "/home/Tina/apache"#' httpd.conf

通常使用“s/from/to/”,但由于到处都有斜杠,因此明智的做法是使用另一个字符,这样您就不必\/在表达式中为每个路径分隔符斜杠编写。我将^...$您的 from 表达式放在周围,以确保仅匹配由完全相同的行组成的行(^是行的开头,$行的结尾)

交换机-i将就地编辑您的文件,但会备份到httpd.conf.bak,这在编辑系统配置文件时是一个非常好的主意。

如果您sed不支持备用分隔符,您可以尝试

sed -i.bak -e 's/^ *ServerRoot  *"\/usr" *$/ServerRoot "\/home\/Tina\/apache"/' httpd.conf

相关内容