使用 sed 从文件中提取一行的一部分

使用 sed 从文件中提取一行的一部分

我想从文件中读取一行的一部分。例如:

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

相关内容