Answers:
在这里,awk可能是更好的工具。
$ cat test.dat
LINE 1
LINE 2
POP3_SERVER_NAME = localhost
搜索包含“ POP3_SERVER_NAME”的行;打印最后一个字段。这并不取决于POP3_SERVER_NAME始终位于第3行,这可能是一件好事。
$ awk '/POP3_SERVER_NAME/{print $NF}' test.dat
localhost
根据您的应用程序,您可能需要使正则表达式更严格。例如,您可能只想匹配以POP3_SERVER_NAME 开头的行。
$ awk '/^POP3_SERVER_NAME/{print $NF}' test.dat
localhost
使用sed不太直观。(谢谢,我知道这很讽刺。)在任何地方都可以找到包含POP3_SERVER_NAME的行。从行首到“ =”后的可选空格,用一个空字符串替换所有文本。然后打印。
sed -n -e '/POP3_SERVER_NAME/ s/.*\= *//p' test.dat
awk
空格使用的分隔符更改为其他内容-F
。例如:在您提到的情况下-F "="
将=
用作定界符。
用替换替换p
命令,该替换将删除行中不需要的部分。
sed -n '3 s/^[^=]*= *//p' installation.sh
您可能希望按关键字而不是按位置匹配行。
sed -n 's/^ *POP3_SERVER_NAME *= *//p' installation.sh
看起来您已经有了一个配置文件。您可以做的事情类似于Adam Siemeon / slm的建议:
sed -nr 's/[^=]+=\s*(.+)$/\1/p' filename
其中[^=]
不包括所有“=”字符,+
表示一个或多个相同类型的字符,这后跟一个实际=
,\s
任何空白(包括突出部\t
和新的线\n
,\r\n
和纯的空间“”,而*
装置零个或多个相同类型的,括号会捕获内部内容,以将匹配的字符序列放入\ 1,\ 2,...,\ n替换占位符,$
表示一行的末尾,这遵循以下典型替换模式:s/.../.../modifiers
。命令行选项-r
代表扩展了regex语法(为方便起见),-n
表示直到或除非明确要求,否则不输出任何内容p
。
您可以使用如下g
修饰符进行全局搜索:
sed -nr 's/[^=]+=\s*(.+)$/\1 /pg' filename # note the space after \1
使您获得通过分隔字符串' '
(可能是\n
,\t
或你有什么),你可以轻松地处理。
两者都是有效的,前提是您的值之前的等式字符跨越到一行的末尾,并且后跟注释或其他语义不同于简单“值”的字符。
我无法在此评论其他人的帖子。为了表明该行,只需在您的情况3中s
在起始引号char 之前或之前传递行号(就像在vim中一样)。
sed -nr '3s/[^=]+=\s*(.+)$/\1/p' filename
请看看info sed
。例如,您特别感兴趣3.2和4.7。
echo "POP3_SERVER_NAME = localhost" | sed 's/.*= //'
localhost
或者,如果文件中包含内容:
sed 's/.*= //' somefile.txt
localhost
awk
命令很好-但前提是您必须在周围有空格=
。它不适用于POP3_SERVER_NAME=localhost
。