我想从文件中读取一行的一部分。例如:
POP3_SERVER_NAME = 本地主机
我只想localhost
使用 sed 返回。
这段文字位于第三行。我这样做是为了提取该行:
sed -n '3p' installation.sh
如何只提取localhost
部分?
答案1
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
答案2
将p
命令替换为删除行中不需要的部分的替换。
sed -n '3 s/^[^=]*= *//p' installation.sh
您可能想按关键字而不是按位置来匹配行。
sed -n 's/^ *POP3_SERVER_NAME *= *//p' installation.sh
答案3
看起来你已经有了一个配置文件。您可以做的与 Adam Siemeon/slm 建议的类似:
sed -nr 's/[^=]+=\s*(.+)$/\1/p' filename
其中[^=]
排除所有 '=' 字符,+
表示一个或多个相同类型的字符,后跟一个实际的=
、\s
任何空白(包括制表符\t
和换行符\n
、\r\n
和纯空格 ' ',而*
表示零个或多个相同类型,括号捕获里面的内容,将匹配的字符序列放入 \1、\2、...、\n 替换占位符中,$
表示行的结尾。这遵循以下典型替换模式:s/.../.../modifiers
命令行选项-r
代表。扩展的正则表达式语法(为了方便起见),意味着在明确请求之前或除非明确请求,-n
否则不输出任何内容。p
您可以使用修饰符进行全局搜索,g
例如:
sed -nr 's/[^=]+=\s*(.+)$/\1 /pg' filename # note the space after \1
这样你就得到一个由' '
(可以是\n
、\t
或你有的东西)分隔的字符串,你可以轻松处理它。
两者都是有效的,前提是您的值前面有等式字符,一直延伸到行尾,并且后面没有注释或其他语义偏离简单“值”的字符。
编辑:
我还不能在这里评论其他人的帖子。要指示行,只需在s
起始引号字符之前或之前传递行号(在您的情况下为 3) (就像在 vim 中一样)。
sed -nr '3s/[^=]+=\s*(.+)$/\1/p' filename
请看一下info sed
。例如,您对 3.2 和 4.7 特别感兴趣。
答案4
echo "POP3_SERVER_NAME = localhost" | sed 's/.*= //'
localhost
或者,如果您的文件中有内容:
sed 's/.*= //' somefile.txt
localhost