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


18

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

POP3_SERVER_NAME =本地主机

我只想localhost使用sed 返回。

这段文字在第三行。我这样做是为了提取行:

sed -n '3p' installation.sh

如何仅提取localhost零件?

Answers:


26

在这里,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
awk命令很好-但前提是您必须在周围有空格=。它不适用于POP3_SERVER_NAME=localhost
MarcelStör16年

2
@Marcel,您可以使用将awk空格使用的分隔符更改为其他内容-F。例如:在您提到的情况下-F "="=用作定界符。
mattpr

7

用替换替换p命令,该替换将删除行中不需要的部分。

sed -n '3 s/^[^=]*= *//p' installation.sh

您可能希望按关键字而不是按位置匹配行。

sed -n 's/^ *POP3_SERVER_NAME *= *//p' installation.sh

6

看起来您已经有了一个配置文件。您可以做的事情类似于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。


5
echo "POP3_SERVER_NAME = localhost" | sed 's/.*= //'
localhost

或者,如果文件中包含内容:

sed 's/.*= //' somefile.txt
localhost

好的,但是我这样读取文件:sed -n'3p'installation.sh
Mercer 2013年

2
@Mercer-查看我添加到答案中的更新。
slm

@Adam Siemion-谢谢,但是如何显示行号?
Mercer

4

您可以使用cut命令,将分隔符设置为'=',然后像这样打印第二个字段:

cut -d'=' -f2

3

考虑到您的文件,有多种方法可以实现foobar

指定要搜索的模式:

PAT=POP3_SERVER_NAME

提取使用 sed

sed -n "/$PAT/p" foobar | sed "s/$PAT = //"

或使用sedcut

sed -n "/$PAT/p" foobar | cut -d' ' -f3

2

Linux / Unix的优点在于,通常有不止一种完成某件事的方法。对于op而言,至少有四种不同的方法可以从文件中提取POP服务器名称:

  1. grep POP3_SERVER_NAME installation.sh | cut -d'=' -f2
  2. grep POP3_SERVER_NAME installation.sh | awk '{print $3}'
  3. grep POP3_SERVER_NAME installation.sh | sed 's/.*= //'
  4. sed -n 's/^.*POP3_SERVER_NAME = //p' installation.sh
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.